【问题标题】:Object.create() JavaScriptObject.create() JavaScript
【发布时间】:2016-05-24 03:47:44
【问题描述】:

我在第 6.1.4 节 Object.create() 中引用了 JavaScript Definitive Guide 一书中的这句话。以下陈述对我来说似乎不清楚。

你可以传递 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 不起作用。我有点困惑,或者可能不明白这里的情况如何。我想知道是否有人可以为我解决问题。任何帮助将不胜感激,并感谢您花时间阅读我的问题。 :)

【问题讨论】:

  • Object.getPrototypeOf(o2.number) === Number.prototype

标签: javascript oop object methods javascript-objects


【解决方案1】:

toString 在您的示例中有效,因为您在 number 上运行它,而不是对象本身。

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

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

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

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

【讨论】:

    【解决方案2】:

    您在 number 属性上调用 toString,这不是对象本身。如果你尝试o2.toString(),它不会起作用。

    【讨论】:

      【解决方案3】:

      当你这样做时......

      o2.number = 1
      

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

      当你这样做时......

      o2.number.toString()
      

      ...您不是在o2 上执行toString,而是在属性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 继承的对象几乎没有优势。如果其他人最终使用了您的代码,那么当其他开发人员尝试调用时,您可能会感到困惑。 hasOwnPropertytoString 在你的对象上,他们得到一个错误(因为这些方法期望任何对象都存在)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-24
        • 2013-01-04
        • 2016-07-10
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多