JavaScript海底两万里:[[Prototype]]、__proto__、prototype
争取一文帮自己搞清楚[[Prototype]]
、__proto__
、prototype
的区别与联系。
在学习JavaScript原型相关内容时,包含”proto”的属性着实不少,各自都有不同的含义。
[[Prototype]]
[[Prototype]]
是对象的隐藏属性,可以认为是一个概念,表示该对象的原型。
proto
__proto__
是JavaScript提供的访问对象原型的方式,通过obj.__proto__
可以访问到obj
的原型,只不过现代JavaScript更加推荐使用Object.getPrototypeOf(obj)
和Object.setPrototypeOf(obj, [descriptors])
来获取和设置对象obj
的原型。
prototype
prototype
是针对函数而言的,只有函数才有这个属性。比如F
是一个构造函数,对于F.prototype
,F.prototype = protoObj;
表示**当创建了一个new F
时,新对象的[[Prototype]]
会被赋值为protoObj
,也就是F.prototype
**。
1 |
|
简单来说,F.prototype
就是调用构造函数F
时创建的对象的原型,可以认为这个“原型”是对象的***模板,这与Java中类是对象的模板*的理念同样非常相似。
原型与原型继承
我们必须要区分这两个概念:构造方法的原型属性F.prototype
是一个模板,它可以创建以此为参考的新对象;原型继承表示多个类之间的继承关系,通过__proto__
可以读取和设置某个对象的[[Prototype]]
属性,即设置该对象的父类。
一个例子
对于两个构造方法Parent
和Child
,Child
从Parent
继承,我们可以通过new Parent()
和new Child
来创建两个对象parent
和child
。
于是,我们可以得到以下推论:
child.__proto__ === parent === Parent.prototype
JavaScript海底两万里:[[Prototype]]、__proto__、prototype
https://skycurtain.github.io/2022/09/05/javascript-drowning-in-prototype-properties/