Js原型对象
这里不介绍原型链。javascript 中有若干长得跟 "prototype" / "proto" 很想的属性/函数,这里简单总结一下他们都是啥,哪个是原型对象,哪个不是。
[[Prototype]]
这个对象的一个内置槽,对程序员是不可见(不能直接操作)的。[[Prototype]] 记录了 javascipt 对象的原型对象。
[[GetPrototypeOf]]
这也是对象的一个内置槽,程序员无法直接操作。它是一个方法,用于获取对象的 [[Prototype]] 槽。在 ECMA262 中,除了 Proxy 类型的对象,其它对象的 [[GetPrototypeOf]] 直接返回 [[Prototype]] 的值。
Object.getPrototypeOf(O)
Object 对象的getPrototypeOf 方法。这个是程序员可以调用的。当O为对象时,返回O.[[GetPrototypeOf]]() 。
这是程序员可以使用的获取 O 的原型对象的方法。
Object.prototype.__proto__
obj.__proto__ 也是 javascript 里常用的一种获取原型对象的方式。它实际是一个 getter / setter 。
用作 getter 时,obj.__proto__ 返回 obj.[[GetPrototypeOf]]() ,也就是可以取得 obj 的原型对象。与 Object.getPrototypeOf(obj) 结果是一致的。
根据 ECMA262 ,这一属性仅在浏览器中提供。不够貌似 node 也提供了这一属性。
由于它定义在 Object.prototype 上,所以,仅当 Object.prototype 在 obj 的原型链上时,才可以使用这一属性。当 Object.prototype 不在原型链上时(例如通过 Object.create(null) 生成的对象),无法使用这一属性。Object.getPrototypeOf(O) 则无此限制。
prototype
这是一个看起来很像原型对象的属性,但是,它不是所在对象的原型对象。即,obj.prototype 不是 obj 的原型对象。构造函数都有此属性。
通常情况下,当使用构造函数(F)构造一个新对象(obj)时,构造函数的 prototype 属性(F.prototype),将成为新对象的原型对象(obj.[[Prototype]])。
F.prototype 不是 F 的原型对象。F.prototype 通常情况下是 new F(...) 的原型对象。
instanceof
obj instanceof F 检查 obj 是否是 F 的实例。它并非检查 F 是否在 obj 的原型链上。这一检查要求 F 是一个构造函数,并检查 F.prototype 是否在 obj 的原型链上。通常所说的 obj 是 F 类型的对象,指的也是 F.prototype 在 obj 的原型链上。
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!