子曰:JS 啊,全是原型
下面相关知识点来自《JavaScript 权威指南(第六版)(中文版)》6.8 对象的三个属性
每一个JavaScript 对象都有与之相关的原型(prototype)、类(class)和可扩展性(extensible attribute)这三个属性。
子曰:原型是JavaScript 对象一个属性
对象的原型属性是用来继承属性的,这个属性如此重要,以至于我们经常把“o 的原型属性” 直接叫做“o 的原型”。
子曰:原型的重要性,或原型是用来干什么的
原型属性是在实例对象创建之处就设置好的。例如,通过对象直接量创建的对象使用Object.prototype
作为它们的原型。而Object.prototype
在使用对象直接量创建对象之前就已经存在了。
子曰:原型是什么时候产生的
在ECMAScript 5 中,将对象作为参数传入Object.getPrototypeOf()
看查询它的原型。在ECMAScript 3 中,则没有与之等价的函数,但经常使用表达式o.constructor.prototype
来检测一个对象的原型。
子曰:如何查询原型
通过new 表达式创建的对象,通常继承一个constructor
属性,这属性指代创建这个对象的构造函数。constructor.prototype
才是对象直接量的真正原型,但对于通过Object.create()
创建的对象则往往不是这样。
子曰:还是如何表示原型,但是提供一个
constructor
属性
想要检测一个对象是否是另一个对象的原型(或处于原型链中),请使用isPrototypeOf()
方法。例如,可以通过p.isPrototypeOf(o)
来检测p 是否是o 的原型:
1 | var p = {x:1} // 定义一个原型对象 |
子曰:如何检测一个对象是否是另一个对象的原型
Mozilla 实现的JavaScript 对外暴露了一个专门命名为__proto__
的属性,用于直接查询/设置对象的原型。但并不推荐使用__proto__
。
子曰:为什么使用
__proto__
,__proto__
的由来