以“一个公式” 的角度理解原型链

栏目: IT技术 · 发布时间: 4年前

内容简介:米娜桑,哦哈哟~原型链,已经是一个老生常谈的话题了,这里就不过多总结,精华一张图就可以搞定。该文章更多的是从

米娜桑,哦哈哟~

原型链,已经是一个老生常谈的话题了,这里就不过多总结,精华一张图就可以搞定。该文章更多的是从 一个公式 的角度讲述原型链。

补充说明

实例化:用类( class )创建对象( obj )的过程。如:

TensionMax = new Person() ,那么 TensionMaxPersion 的实例(对象)。

但由于 JavaScript 并不存在类,所以 JavaScript 所谓的类,只是我们模拟出来的函数,最终还是基于原型构建。

以下 3 个观点只是为了更方便快捷地理解原型链,切勿对号入座。其中依然存在着先有鸡还是先有蛋的问题。对于单纯的开发者来说,感兴趣或者时间充裕的话可以深究,已附上友情链接于本章结尾。

先上结论

1、 obj.proto === class.prototype

满足此式子时,我们可以把 obj 称之为 class 实例出来的对象。

2、 obj 上属性的查找会以 __proto__ 链条的方式进行查找,直到为 null 时终止。

3、以第 1 点为理解导向,原型链的终点是 Object.prototype

1、class.prototype === obj.__proto__

这条就当作是一个公式。满足这一条,那么我们可以把 obj 当作 class 实例出来的对象。

当我们实例出 Personlet Tension = new Person() ,其中的关系图如下:

以“一个公式” 的角度理解原型链

let Person = function (name, age) {
    this.name = name
    this.age = age
    this.race = 'human'
}
Person.prototype.country = 'China'

console.log(Person.prototype) 
//输出{country: 'China', constructor: Person}

也就是说 Person.prototype.constructor === Person

创建函数时,函数会自带特有的属性 prototype

而当实例 Persion

let TensionMax = new Person('huang', 10) 

console.log(TensionMax) //{name: 'huang', age: 10, race: 'human'}
console.log(TensionMax.country) //China
console.log(TensionMax.__proto__.country) //China

换句话而言, new 操纵符 实际做了以下的事情。

let TensionMax = {} //即 new Object()
TensionMax.__proto__ = Person.prototype

Person.call(TensionMax)
//call在这里的作用是将 Person 的 this 值拷贝到 TensionMax 对象中。

也就是说,当实例化对象后,对象 TensionMax 和对应的类 Person 通过 __proto__ 来链接。

2、obj 的属性会以 "__proto__" 链条的方式进行查找,直到为 null 时终止

根据上述的关系图,如果一直根据 __proto__ 这个链条查找,会有一个终点。

console.log(TensionMax.__proto__.__proto__.__proto__) //null

(TensionMax.__proto__).__proto__ === Object.prototype //true

根据第 1 点的公式, TensionMax.__proto__Person.prototypeObject 函数这个类实例出来的对象。最终到达终点 Object.prototype

以“一个公式” 的角度理解原型链

console.log(Object.prototype.prototype) //undefined
console.log(Object.prototype.__proto__) //null

3、原型链的终点是 Object.prototype

以第 1 点为理解导向,原型链的终点是 Object.prototype ,那么有如下关系:

Tension为 Person 的实例对象

Person为 Function 的实例对象

Person.prototypeObject

的实例对象

Function为 Function 的实例对象

Object为 Function 的实例对象

Function.prototype为 Object 的实例对象

以“一个公式” 的角度理解原型链

根据第 1 点的公式,以 __proto__ 箭头为导向可以看出,先有 Object.prototype ,由之诞生 Function.prototype ,随后才有了 FunctionObject

那么 FunctionObject 谁先有,还有待深究。


以上所述就是小编给大家介绍的《以“一个公式” 的角度理解原型链》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

来自圣经的证明

来自圣经的证明

M.Aigner、G.M.Ziegler / 世界图书出版公司 / 2006-7 / 39.00元

作为一门历史悠久的学问,数学有她自身的文化和美学,就像文学和艺术一样。一方面,数学家们在努力开拓新领域、解决老问题;另一方面他们也在不断地从不同的角度反复学习、理解和欣赏前辈们的工作。的确,数学中有许多不仅值得反复推敲理解,更值得细心品味和欣赏的杰作。有些定理的证明不仅想法奇特、构思精巧,作为一个整体更是天衣无缝。难怪,西方有些虔诚的数学家将这类杰作比喻为上帝的创造。 本书已被译成8种文字。......一起来看看 《来自圣经的证明》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码