prototype是函数独有的属性。当我们使用关键词new并且将函数作为构造函数来构造对象的时候,它被用来构建对象的__proto__属性。
当你创建函数时,JS会为这个函数自动添加prototype属性,值是一个有 constructor 属性的对象。而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数的实例,实例继承构造函数prototype的所有属性和方法(实例通过设置自己的__proto__指向承构造函数的prototype来实现这种继承)。
JS正是通过__proto__和prototype的合作实现了原型链,以及对象的继承。
不管咋说都不好理解 ,简单写个例子吧:
function fn(name) {
this.name = name;
}
fn.prototype.show = function() {
alert(this.name);
}
var obj = new fn('my name is obj'); // 通过new字符,obj的__proto__默认指向fn.prototype
obj.show() // 输出my name is obj
aa.__proto__ = Array; // 直接修改aa.__proto__到Array,aa便有了数组的静态方法
aa.isArray( [] ) // true
aa.show // 此时是undefined 因为原型链指向已经被修改了
最后说一下constructor构造函数,__proto__的constructor其实很好理解,最简单的理解就是调用的谁就是谁,上面 var obj = new fn('my name is obj') 中调用的是fn函数,所以 obj.__proto__.constructor === fn 输出 true,fn的构造函数来自内置Function对象,fn.__proto__.constructor === Function 也是输出true。