深入挖掘原型链

2022-12-27 0 944

1.蓝本第一类,示例第一类与缺省

假如想深入细致认知蓝本链,具体来说须要明晰晓得甚么是蓝本第一类,甚么是示例第一类,和蓝本第一类,示例第一类与缺省二者间的亲密关系。

具体来说,示例第一类是指透过URLnew,由缺省构造出的第一类示例第一类能有数个,因而示例第一类会承继它的蓝本第一类上的大部份特性。

function Foo() { } var f1=new Foo(); var f2=new Foo();

f1 与 f2 是由构造函数 Foo 透过URLnew建立的三个示例第一类。

console.log(f1.__proto__ === Foo.prototype);//true console.log(f2.__proto__ === Foo.prototype);//true console.log(f1.__proto__ === f2.__proto__);//true

因而当他们在蓝本第一类上加进特性或方式时,大部份的示例第一类单厢承继该特性或方式,他们能将许多房屋建筑的方式表述在Foo.prototype上。

2.蓝本第一类,示例第一类和缺省二者的亲密关系

每一示例第一类的蓝本第一类上都有两个constructor特性,那个特性对准示例第一类的缺省,示例第一类能从它的蓝本第一类上承继该特性。

二者的关系听出来极为绕口,但用标识符充分体现就很明晰了:

示例第一类 f1 ,缺省 Foo ,蓝本第一类 Foo.prototype===f1.__proto__

console.log(Foo.prototype.constructor === Foo);//true console.log(f1.__proto__.constructor === Foo);//true console.log(f1.constructor === Foo);//true console.log(f1.constructor === f1.__proto__.constructor);//true

3.JavaScript的蓝本链规则

1.js中规定,大部份的第一类都有自己的蓝本第一类,蓝本第一类和和函数也是第一类,所以他们也有自己的蓝本第一类(__proto__),因而会形成蓝本链。

2.js中读取特性和方式的规则:js引擎会具体来说在第一类本身查找特性和方式,假如找不到就会沿着蓝本链逐层向上查找,最终找不到就会返回undefined。假如找到了就不会再继续查找,所以当两个示例第一类和它的蓝本第一类上具有同名特性或方式时,只会查找到第一类本身的特性或方式。

使用图示能更好地认知蓝本链:

function Foo() { } var f1 = new Foo();

以上这段标识符:

具体来说有示例第一类,缺省和蓝本第一类

蓝本第一类的 constructor 对准缺省,示例第一类承继的 constructor 也是对准缺省,示例第一类和缺省的 __proto__ 和 prototype 对准同两个蓝本第一类。

深入挖掘原型链

然后,因为 Foo.prototype 也是两个第一类,他也具有自身的蓝本第一类 __proto__ ,由二者亲密关系他们能晓得,

Foo.prototype.__proto__.constructor 应该对准 Foo.prototype 的缺省,输出结果是 Object ,即

Foo.prototype.__proto__.constructor===Object ,因而 Object.prototype 也应该有自己的蓝本第一类,输出为 null 。

所以有:

深入挖掘原型链

再然后,缺省 Foo 和 Object 也是示例第一类,他们也应该由自己的蓝本第一类 __proto__ ,而大部份的函数都是由缺省 Function 内部结构的,所以 Object.__proto__===Function.prototype , Foo.__proto__===Function.prototype , Object.__proto__===Foo.__proto__ ,因而 Function.prototype 也有自己的蓝本第一类 __popto__ ,对准了 Object.prototype ,能画出:

深入挖掘原型链

蓝本链图示

这是一条完整的蓝本链了,从图中他们能发现:

Object.prototype 是蓝本链的尽头,再向上是 null 了, null 是无意义的,一次大部份的第一类都承继了 Object.prototype 上的特性和方式。

4.提两个小问题,我想让Foo的所有示例第一类都具有数组的特性和方式,应该怎么做呢?

透过上面的分析,他们晓得,示例第一类共用的特性和方式都应该表述在了他们的蓝本第一类上,所以数组的特性和方式都在 Array.prototype 上,

示例第一类 f1,f2 共用的特性和方式来自 Foo.prototype ,所以他们能:

Foo.prototype=Array.prototype

这样 f1,f2 就承继了数组的特性和方式,但他们须要注意一点,此时输出 f1.constructor ,来观察 f1,f2 的缺省会发现它们已经成了 Array ,

这是因为 constructor 特性同样是从蓝本第一类 Foo.prototype 上承继而来的,所以当 Foo.prototype 上的 constructor 特性发生变化时,示例第一类 f1 的 constructor 也会变化。所以他们假如不想让缺省发生变化的话,须要重写一次 Foo.prototype 的 constructor 特性,

Foo.prototype=Array.prototype

Foo.prototype.constructor=Foo 。

所以他们须要注意,在修改示例第一类的蓝本第一类之后,也要记得修改 constructor 特性

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务