Object如何比实际对象拥有更多功能?

时间:2016-06-18 03:18:05

标签: javascript

我很困惑为什么var obj = {};var obj = new Object();然后obj.getOwnPropertySymbols未定义?

example 1

example 2

3 个答案:

答案 0 :(得分:3)

Object本身定义了一些方法,例如Object.keys。这些没有在Object.prototype上定义,因此它们在对象实例上不可用。

答案 1 :(得分:3)

构造函数有两种不同的方法:

  • 原型方法

    定义为Constructor.prototype的属性,仅在实例上可用。

  • 静态方法

    定义为Constructor本身的属性,仅在构造函数中可用。

ES6 classe说清楚

class Constructor {
  static foo() { return 123; }
  bar() { return 456; }
}
Constructor.foo(); // 123
Constructor.bar;   // undefined
new Constructor().foo; // undefined
new Constructor().bar; // 456

然而,您的情况很特殊:Object构造函数的静态方法似乎包含原型方法。但那是因为Object继承自Object.prototype

原型链就像

  • Object实例

    instance -> Object.prototype -> null
    
  • Object构造函数

    Object -> Function.prototype -> Object.prototype -> null
    

答案 2 :(得分:1)

从技术上讲,Object(构造函数)不属于object类型,它是一个类/函数,具体取决于您希望与JS一起使用的术语。因为它是一个类,所以它上面有没有在该对象的实例中使用的方法。 IE:他们不在返回的对象原型上。

在Chrome控制台中,试试这个:

var obj = {};
typeof obj; // "object"
typeof Object; // "function"

当你有机会时,研究类原型在JS中的工作方式。

为了澄清一点,当你运行new Object()时,它会返回类型为object且具有必要方法的内容。

我认为这是我所谈论的一个很好的参考:JavaScript - The Good Parts: Function prototypes vs Object prototypes

您可以在NumberString中看到相同的行为。两者的类型实际上都是function,但是一旦创建它们,您就会获得numberstring类型之一,每个类型都有相关的原型方法。

底线是构造函数与返回值不同。