簡體   English   中英

JavaScript 中內部 [[prototype]] 屬性的默認值是多少?

[英]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 定義了多種對象,例如 -

  1. 普通對象
  2. 函數對象
  3. 內置函數對象
  4. 內置外來物體
  5. 代理對象

基於這些對象類型,定義了[[Prototype]]默認值。

示例 1 :對於我們創建的普通對象,例如let p1 = new Person(); ,我們將Person.protoype作為p1 [[Prototype]]值。 我引自ECMA 2019

9.1.13 OrdinaryCreateFromConstructor(構造函數,internalDefaultProto [,internalSlotsList])

抽象操作 OrdinaryCreateFromConstructor 創建一個普通對象,其[[Prototype]] 值是從構造函數的原型屬性中檢索的(如果存在)。 否則,由 internalDefaultProto 命名的內部函數用於 [[Prototype]]。 可選的 internalSlotsList 是必須定義為對象一部分的其他內部插槽的名稱列表。 如果未提供列表,則使用新的空列表。 此抽象操作執行以下步驟:

  1. 斷言:intrinsicDefaultProto 是一個字符串值,它是本規范的內部對象的名稱。 相應的對象必須是旨在用作對象的 [[Prototype]] 值的內在對象。
  2. 讓原型是? GetPrototypeFromConstructor(構造函數,intrinsicDefaultProto)。
  3. 返回 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 執行以下步驟:

  1. 斷言:類型(函數原型)是對象。
  2. 斷言:functionKind 是“普通”、“非構造函數”、“生成器”、“異步”或“異步生成器”。
  3. 如果 functionKind 為“正常”,則讓 NeedConstruct 為真。
  4. 否則,讓需要構造為假。
  5. 如果 functionKind 是“非構造函數”,則將 functionKind 設置為“normal”。
  6. 設 F 是一個新創建的 ECMAScript 函數對象,其內部槽列在表 27 中。所有這些內部槽都被初始化為 undefined。
  7. 將 F 的基本內部方法設置為 9.1 中指定的默認普通對象定義。
  8. 將 F.[[Call]] 設置為 9.2.1 中指定的定義。
  9. 如果 NeedConstruct 為真,則 a. 將 F.[[Construct]] 設置為 9.2.2 中指定的定義。 將 F.[[ConstructorKind]] 設置為“base”。
  10. 將 F.[[Strict]] 設置為嚴格。
  11. 將 F.[[FunctionKind]] 設置為 functionKind。
  12. 將 F.[[Prototype]] 設置為 functionPrototype。
  13. 將 F.[[Extensible]] 設置為 true。
  14. 將 F.[[Realm]] 設置為當前 Realm Record。
  15. 返回 F。

這個functionPrototype只不過是Function.prototype

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM