js原型链全解

2020-03-14  本文已影响0人  幽幽_默默

每一个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

最后一行,证明了数组的方法是共用的。

上一篇下一篇

猜你喜欢

热点阅读