簡體   English   中英

為什么 Object.create 沒有按預期克隆屬性?

[英]Why Object.create doesn't clone properties as expected?

如果我在控制台中輸入:

var x = {a: 1};
var y = Object.create(x);
console.log(y);

它顯示{} 但是如果我在小提琴中運行它,它會顯示{a: 1} ,這是預期的結果。 也在這里:

 var x = {a: 1}; var y = Object.create(x); console.log(y);

那么發生了什么?

回答

為什么 Object.create 沒有按預期克隆屬性?

因為Object.create不應該克隆屬性。

JavaScript 對象很棘手

如果我們查看Object.create的文檔,它會說:

Object.create() 方法創建一個新的 object,使用一個現有的 object作為新創建的 ZA8CFDE63318CBD4B666ZZZ 的原型

除了自己的屬性外,JavaScript 中的每個 object 還繼承了原型的屬性。

現在,棘手的部分是——繼承的屬性僅在某些情況下可見。 例如:

  • 屬性訪問器 – yay['a'] – ✅ 看到繼承的屬性
    • console.log(ya); // outputs 1
  • Object.keys , Object.values , Object.entries – ❌沒有看到繼承的屬性
    • console.log(Object.keys(y)); // outputs []

這些概念在屬性的可枚舉性和所有權中得到了更全面的介紹。

有關原型的更詳盡解釋,請參閱Object 原型

為什么 JSFiddle 的打印方式與 Chrome 不同?

顯然,JSFiddle 的console實現枚舉了繼承的屬性,而 Chrome 的console實現沒有。

即使在控制台中也可以按預期運行。 您只需擴展 Object。

在此處輸入圖像描述

暫無
暫無

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

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