簡體   English   中英

在Object.create之后:屬性存在,但是Object.keys / getOwnPropertyNames = []?

[英]After Object.create: properties are there, but Object.keys / getOwnPropertyNames = []?

就像標題所說的那樣,我在理解Object.create()的工作原理時遇到了概念上的障礙。

我的印象是,使用此方法后,生成的對象將繼承作為參數傳遞給Object.create()的對象的值。 在下面的簡單示例中,我可以創建一個對象並訪問其繼承的值,甚至可以正確獲取新對象的原型,但是Object.keys()數組為空!

let obj = Object.create({x: 1, y: 2});
console.log("Keys of obj:");
Object.keys(obj).forEach(function (key) {
  console.log(key + ' - ' + obj[key]);
});
console.log("Prototype of obj:");
console.log(Object.getPrototypeOf(obj));
console.log("obj.x = " + obj.x);

控制台結果:

acg@acg:~/dev/$ node test.js 
Keys of obj:
Prototype of obj:
{ x: 1, y: 2 }
obj.x = 1

(只是為了消除任何混亂:順便說一下,當用Object.getOwnPropertyNames()替換Object.keys()時,我得到相同的結果)。

我誤會了嗎? 為什么鍵數組為空?

編輯:我是否假設Object.keys()和Object.getOwnPropertyNames()僅給我直接在對象上可用的屬性,即未繼承? 然后,我想我的問題是:是否有一個函數可以給我一個對象的屬性? (繼承或以其他方式)

EDIT2:不,必須手動遍歷原型鏈,如下所示: 是否可以獲得對象的不可枚舉的繼承屬性名稱?

EDIT3:根據下面來自Pol Martin的回答,可以使用for..in構造遍歷所有屬性(包括繼承的屬性)。 另請參閱https://stackoverflow.com/a/208439/7705625

Object.create有兩個參數。 第一個是創建對象的原型,第二個可選參數是屬性描述符的對象。

Object.create(proto[, propertiesObject])

如果您創建將屬性對象作為第一個參數傳遞的對象,

let obj = Object.create({x: 1, y: 2});

這將成為您新對象的原型。 由於Object.keys()返回僅包含其自己的可枚舉屬性的數組,因此在構造它時傳遞的那些屬性將不會列出。

要按照您想要的方式創建對象,可以使用Object.assign:

let obj = Object.assign({}, {x: 1, y: 2});

暫無
暫無

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

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