![](/img/trans.png)
[英]In JavaScript, what is the default value of a function's prototype property?
[英]What is the default value of internal [[prototype]] property in JavaScript?
每個對象都有一個[[prototype]]
屬性。 默認情況下,它是全局Object
構造函數的一個實例。
令我困惑的是這段代碼:
var obj1 = {};
var obj2 = {};
console.log(obj1.__proto__ == obj2.__proto__); //true
這里的[[prototype]]
兩個對象都引用了同一個Object
實例。
我的問題是:JavaScript 是否有一個保留的Object
實例,在我們沒有指定[[prototype]]
值的地方使用它?
默認情況下,它是全局 Object 構造函數的一個實例。
默認情況下,每個原型鏈中的最后一個對象是Object.prototype
。 它實際上不是Object
的實例:
> Object.prototype instanceof Object
false
僅僅是因為Object.prototype
本身沒有原型。
JavaScript 是否有一個保留的 Object 實例,在我們沒有指定
[[prototype]]
值的地方使用它?
看上面。
JavaScript 中對象的原型是其構造函數的原型屬性。
如果你定義一個新的構造函數:
function MyConstructor() {}
從它實例化的所有對象都具有相同的原型,即 MyConstructor.prototype。
var a = new MyConstructor();
var b = new MyConstructor();
console.log(a.__proto__ == b.__proto__); //true
在您的特定情況下,您使用的是內聯對象 {} 此對象是使用默認 Object() 構造函數創建的,因此它們共享與上述相同規則的相同原型。
我認為Felix Kling的回答部分正確。 根據ECMA 2019 ,JS 定義了多種對象,例如 -
基於這些對象類型,定義了[[Prototype]]
默認值。
示例 1 :對於我們創建的普通對象,例如let p1 = new Person();
,我們將Person.protoype
作為p1
[[Prototype]]
值。 我引自ECMA 2019 :
9.1.13 OrdinaryCreateFromConstructor(構造函數,internalDefaultProto [,internalSlotsList])
抽象操作 OrdinaryCreateFromConstructor 創建一個普通對象,其[[Prototype]] 值是從構造函數的原型屬性中檢索的(如果存在)。 否則,由 internalDefaultProto 命名的內部函數用於 [[Prototype]]。 可選的 internalSlotsList 是必須定義為對象一部分的其他內部插槽的名稱列表。 如果未提供列表,則使用新的空列表。 此抽象操作執行以下步驟:
- 斷言:intrinsicDefaultProto 是一個字符串值,它是本規范的內部對象的名稱。 相應的對象必須是旨在用作對象的 [[Prototype]] 值的內在對象。
- 讓原型是? GetPrototypeFromConstructor(構造函數,intrinsicDefaultProto)。
- 返回 ObjectCreate(proto, internalSlotsList)。
例 2 :讓我們再舉一個函數對象的例子。 我們有以下代碼:
var foo = function(){};
function hoo(){};
console.log(foo.__proto__== Function.prototype);//true
console.log(hoo.__proto__== Function.prototype);//true
我再次引用ECMA2019 的內容:
9.2.3 FunctionAllocate ( functionPrototype, strict, functionKind ) 抽象操作 FunctionAllocate 需要三個參數 functionPrototype、strict 和 functionKind。 FunctionAllocate 執行以下步驟:
- 斷言:類型(函數原型)是對象。
- 斷言:functionKind 是“普通”、“非構造函數”、“生成器”、“異步”或“異步生成器”。
- 如果 functionKind 為“正常”,則讓 NeedConstruct 為真。
- 否則,讓需要構造為假。
- 如果 functionKind 是“非構造函數”,則將 functionKind 設置為“normal”。
- 設 F 是一個新創建的 ECMAScript 函數對象,其內部槽列在表 27 中。所有這些內部槽都被初始化為 undefined。
- 將 F 的基本內部方法設置為 9.1 中指定的默認普通對象定義。
- 將 F.[[Call]] 設置為 9.2.1 中指定的定義。
- 如果 NeedConstruct 為真,則 a. 將 F.[[Construct]] 設置為 9.2.2 中指定的定義。 灣將 F.[[ConstructorKind]] 設置為“base”。
- 將 F.[[Strict]] 設置為嚴格。
- 將 F.[[FunctionKind]] 設置為 functionKind。
- 將 F.[[Prototype]] 設置為 functionPrototype。
- 將 F.[[Extensible]] 設置為 true。
- 將 F.[[Realm]] 設置為當前 Realm Record。
- 返回 F。
這個functionPrototype只不過是Function.prototype
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.