[英]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.number
上o2.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时,您可能会感到困惑。 在您的对象上具有hasOwnProperty
或toString
,并且它们收到错误消息(因为这些方法预期对任何对象都存在)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.