繁体   English   中英

Object.create()JavaScript

[英]Object.create() JavaScript

我在《 JavaScript权威指南》第6.1.4节Object.create()中引用了此语句。 以下陈述对我来说似乎并不明确。

您可以传递null来创建一个没有原型的新对象,但是如果这样做,新创建的对象将不会继承任何东西,甚至不会继承toString()之类的基本方法(这意味着它无法与+一起使用运算符)

 var o2 = Object.create(null) // o2 inherits no props or methods. 

此时,我在想“哦哇”。 设置Object.create(null)时,它不会继承任何基本方法。 因此,我尝试在控制台上尝试一下,看看是否确实是这种情况。 我运行了下面的脚本,并得到了意外的结果。

 var o2 = Object.create(null); o2.number = 1; console.log(o2.number.toString()); // "1" 

当我运行这段代码时,我以为.toString不起作用。 我有点困惑,或者可能不明白这里的工作方式。 我想知道是否有人可以帮我解决问题。 任何帮助将不胜感激,并感谢您拨冗阅读我的问题。 :)

toString在您的示例中起作用,因为您是在数字而不是对象本身上运行它。

之所以有效,是因为它与以下内容没有什么不同:

var n = 1;
console.log(n.toString());

要查看没有原型的结果,请尝试以下方法:

var o2 = Object.create(null);
console.log(o2.toString());

您要在number属性(不是对象本身)上调用toString 如果尝试使用o2.toString() ,它将无法正常工作。

当你做...

o2.number = 1

...您正在创建一个名为number的属性,并将该属性添加到o2对象中。

当你做...

o2.number.toString()

...您不是在o2上执行toString ,而是在属性o2.numbero2.number

如果你做...

console.log(typeof o2.number)

...您将看到o2.number具有类型number ,因此具有与数字相关的所有方法。

如果你做...

console.log(typeof o2)

...您会看到o2类型为object

如果尝试执行o2.toString ,则会收到错误消息,并看到此对象确实没有任何名为toString方法。


注意 :

以我的经验,您可能永远不想做...

var o2 = Object.create(null);
o2.number = 1;

相反,您可能想要的是...

var o2 = Object.create(Object.prototype);
o2.number = 1;

...可以像...一样优雅地书写

var o2 = {
    number : 1
};

创建不继承自Object.prototype对象几乎没有优势。 而且,如果其他人最终使用了您的代码,则在其他开发人员尝试调用eg时,您可能会感到困惑。 在您的对象上具有hasOwnPropertytoString ,并且它们收到错误消息(因为这些方法预期对任何对象都存在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM