我知道每个JavaScript对象都有一个名为[[Prototype]]
的内部属性。某些实现允许通过名为__proto__
的属性访问它,而其他实现则不允许。围绕此属性的括号是否有任何特殊意义?
答案 0 :(得分:33)
它是对象的“内部属性”。来自ECMAScript 8.6.2:
此规范使用各种内部属性来定义对象值的语义。 这些内部属性不是ECMAScript语言的一部分。它们仅由出于说明目的而由此规范定义。 ECMAScript的实现必须表现得就像它以此处描述的方式在内部属性上生成和操作一样。 内部属性的名称用双方括号[[]]括起来。
声明“这些内部属性不是ECMAScript语言的一部分”,意味着内部属性不是可以在实际代码中使用的标识符 - 内部属性不能作为包含它们的对象的成员访问。但是,他们可以 可以通过特定的功能或属性进行访问(例如,某些浏览器非常友好,您可以通过{{1}设置并获取[[Prototype]]
}属性,ES5规范允许通过__proto__
进行只读访问。
在单个括号上使用双括号可能是为了避免与实际bracket notation混淆(即属性访问)。
答案 1 :(得分:10)
双括号[[Prototype]]
是一个内部链接,它将一个对象紧密绑定到另一个对象。
创建函数时,正在创建一个名为 prototype 的属性对象,并将其添加到函数的名称变量(我们称之为constructor
)中。该对象指向或具有本机JavaScript对象的内部私有链接。
示例:
function Foo () {
this.name = 'John Doe';
}
// Foo has an object 'property' called prototype
// prototype was created automatically when we declared the function Foo.
// Now, we can assign properties to it without declaring the prototype object first.
Foo.prototype.myName = function () {
return 'My name is ' + this.name;
}
现在,如果我们使用Foo
关键字从new
创建一个新对象,我们基本上创建一个新对象,其中包含一个指向该函数的内部链接& #39;我们之前讨论的原型(Foo
):
var obj = new Foo();
obj.__proto__ === Foo.prototype // true
obj.[[Prototype]] === Foo.prototype // true
作为
obj.__proto__ === obj.[[Prototype]] // true
由于[[Prototype]]
是该函数对象的私有链接,因此许多浏览器为我们提供了公共链接。那是__proto__
(发音为dunder proto)。
__proto__
实际上是属于本机JavaScript对象的getter函数,并返回this
绑定所在的内部 - 私有原型链接(返回[[Prototype]]
obj
):
obj.__proto__ === Foo.prototype // true
BTW,从ES5
开始,我们可以使用getPrototypeOf
方法获取内部私人链接:
obj.__proto__ === Object.getPrototypeOf(obj) // true
注意:这个答案并不打算涵盖创建新对象或新构造函数的整个过程,而是帮助更好地理解[[Prototype]]
是什么以及它是如何工作的
答案 2 :(得分:7)
它在括号中的原因是表示它是私有财产。括号本身从不在任何地方的代码中使用。
正如您所指出的,某些实现提供了对__proto__
下的私有财产的访问权限,但它是非标准的。