为什么*不*在JavaScript中“继承”/扩展来自Object?

时间:2011-10-06 15:19:58

标签: javascript

众所周知,使用JSON表示法声明对象使它们从基础对象“继承”(或者更确切地说,构建为基础对象):

myobj={a:1, b:2};

几乎等同于myobj = Object.create(Object); myobj.a=1; myobj.b=2;

而不是:

  

Object.getPrototypeOf(MyObj中)

打印以下内容:

Object
    __defineGetter__: function __defineGetter__() { [native code] }
    __defineSetter__: function __defineSetter__() { [native code] }
    __lookupGetter__: function __lookupGetter__() { [native code] }
    __lookupSetter__: function __lookupSetter__() { [native code] }
    constructor: function Object() { [native code] }
    hasOwnProperty: function hasOwnProperty() { [native code] }
    isPrototypeOf: function isPrototypeOf() { [native code] }
    propertyIsEnumerable: function propertyIsEnumerable() { [native code] }
    toLocaleString: function toLocaleString() { [native code] }
    toString: function toString() { [native code] }
    valueOf: function valueOf() { [native code] }

但是,可以在提供Object.create()作为参数时调用null

myobj2 = Object.create(null);

在这种情况下,将返回空原型:

Object
    No Properties

这里提出了一个问题:在哪些情况下以及为什么我应该将原型链分解为原始Object?它有用吗?

更新已经在下面更正了,我的意思是Object.create(Object.prototype)而不是Object.create(Object)会返回Function个对象(实际上Object()是一个Object原型的构造函数。)

1 个答案:

答案 0 :(得分:4)

而不是:

myobj = Object.create(Object);

......我认为你的意思是等同于:

myobj = Object.create(Object.prototype);

...因为:

Object.getPrototypeOf( {a:1, b:2} ) === Object.prototype;  // true

至于为什么提前使用null,如果你的对象不需要Object.prototype的任何属性,那么在技术上(虽然稍微有点)加速链属性时,属性查找会加速属性查找 在相关对象上不存在

请注意,我说“早”,因为链始终以null结尾。

Object.getPrototypeOf( Object.prototype );  // null


             obj ----------> proto -------> Object.proto -----> null
         +---------+      +---------+      +-------------+     
         |         |      |         |      |             |
         |  foo:1  |      |  bar:1  |      | toString:fn |      null
         |         |      |         |      |             |
         +---------+      +---------+      +-------------+ 
              ^                ^                  ^               X
              |                |                  |               |
obj.foo ------+                |                  |               |
              ^                |                  |               |
obj.bar-------+----------------+                  |               |
              ^                ^                  |               |
obj.toString--+----------------+------------------+               |
              ^                ^                  ^               |
obj.baz-------+----------------+------------------+---------------+

   ^---property lookups

请注意原型链中的任何位置都不存在baz属性。

因此,它需要按顺序搜索每个对象,直到它最终到达null,然后才意识到baz在任何地方都不存在。

如果您从链中消除Object.prototype,它会更快地到达null