使用Object.create(null)创建的映射具有toString属性

时间:2018-07-11 01:48:09

标签: javascript object prototype

我正在阅读Eloquent JavaScript(https://eloquentjavascript.net/),在第6章中,Marjin Haverbeke建议了一种创建我们自己的地图版本的方法是使用Object.create(null)。本书中的示例是

  

console.log(Object.create(null)中的“ toString”);       //为空

我尝试使用此方法创建地图。这是我所做的:

let ages = Object.create(null); 
ages = {Boris : 29, Liang : 22, > Julia : 62};
console.log("Do we know toString's age?", 'toString' in ages);
//returns true

我希望最后一个console.log返回false,但是它为true。为什么是这样?如何使用此想法创建不继承toString属性的映射? 注意:我隐约知道map数据类型,但是我试图弄清楚这一点是出于概念上的理解。

2 个答案:

答案 0 :(得分:3)

重新分配 ages到对象文字,该文字确实正确继承了toString。重新分配Object.create(null)变量后,通过ages创建的对象不再具有任何引用。如果您没有重新分配ages并只是为其分配了属性,则它将不像您期望的那样具有toString属性:

const ages = Object.create(null); 
Object.assign(ages, {Boris : 29, Liang : 22, Julia : 62});
console.log("Do we know toString's age?", 'toString' in ages);

// similarly:

const ages2 = Object.create(null);
ages2.Boris = 29;
ages2.Liang = 22;
ages2.Julia = 62;
console.log("Do we know toString's age?", 'toString' in ages);

答案 1 :(得分:1)

使用以下行,您正在重新创建对象:

 ages = {Boris : 29, Liang : 22, > Julia : 62};

我想做的是以下几点:

 ages = Object.create(null); 
 ages.Boris = 29;
 ages.Liang = 22;
 ages.Julia = 62;
 console.log("Do we know toString's age?", 'toString' in ages); // => false

关于, 文森特