每一个JavaScript对象(除了 null )都具有的一个属性,叫proto,这个属性会指向该对象的原型.
即对于每一个new出来的函数,我们看看都执行了些什么
1.var obj = {};
2.obj.__proto__ = Base.prototype;
3.Base.call(obj);
第一行,我们创建了一个空对象obj
第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象
第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”,关于call函数的用法。
下面举个例子。
原型对象的理解person1实例对象的原型指向了Keith.prototype。即Keith.prototype就是一个原型对象
Keith的原型指向了Function.prototype。
Function.prototype的原型指向了Object.prototype。
Object.prototype的原型指向了Null。
理解了这个,我们再来看下面的这张图
函数的原型链图解prototype存在的目的,由于每个对象实例中的属性和方法都在各自的实例中,其中方法是刻意共用的,为了使不同对象实例之间的方法刻意共用,于是便诞生了prototype。比如
var arr1 = [1, 0, 0, 8, 6];
var arr2 = [1, 0, 0, 8, 6, 1, 1];
arr1.sort(function(n1, n2) {
return n1 - n2;
});
arr2.sort(function(n1, n2) {
return n1 - n2;
});
console.log(arr1); //[0, 0, 1, 6, 8]
console.log(arr2); //[0, 0, 1, 1, 1, 6, 8]
console.log(arr1 === arr2);//false
console.log(arr1.sort === arr2.sort);//true
最后一行,证明了数组的方法是共用的。
网友评论