原型与继承

1、prototype、__proto__的关系与区别
首先有3点你需要记住:
a)JS中所有的函数都由一个叫做Function的构造器创建。当一个函数对象被创建时,Function构造器会”隐蔽地”给这个函数对象添加一个叫做prototype的属性,其值是一个包含函数本身(constuctor)的对象;
b)当new运算符使用构造函数产生对象实例时,会“强制性地”在新对象(new出来的是一个对象,而非函数)中添加一个叫做__proto__的属性作为”隐秘连接“,它的值就等于它的构造函数prototype属性的值,换句话说,这使它与其构造函数的prototype属性指向同一个对象。
c)每一个javascript对象都会拥有一个叫做__proto__的属性,因为javascript中所有的对象都隐式或显式地由构造函数new出,于是,也可以说在javscript中没有真正意义上的空对象。
所以:
任意一个函数都可以做为构造函数,拥有prototype属性。而任意一个对象都拥有__proto__属性(只有chrome和FF提供了访问方法,IE不能访问)。如下用代码验证:

var a = function() {
	console.log('a');
};
console.log(a.prototype); // Object {constructor:function,__proto__:Object}
console.log(a.prototype.constructor === a); // true

如下图:
1.png
2.原型链
由上可知,原型prototype是javascript函数的一个属性,当这个函数作为构造器产生实例时,new运算符会获得函数的prototype属性的值并将其赋给对象实例的__proto__属性,并以此作为隐秘连接。因此,你在构造函数的prototype属性中设置的值都会被该构造器的实例所拥有。
原型链的根本就是__proto__(非官方称呼)
3.原型与继承
查看上一篇博客 简单继承
参考文章:

轻松理解javascript原型——读完秒懂

此条目发表在JavaScript分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注