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

Bre*_*eak 13 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] }
Run Code Online (Sandbox Code Playgroud)

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

myobj2 = Object.create(null);
Run Code Online (Sandbox Code Playgroud)

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

Object
    No Properties
Run Code Online (Sandbox Code Playgroud)

这里提出了一个问题:在哪些情况下,我为什么要关注原型链到原始链Object?它有用吗?

更新:正如下面已经纠正的那样,我的意思是Object.create(Object.prototype)而不是Object.create(Object)返回Function对象(实际上Object()Object原型的构造函数).

use*_*716 4

而不是这个:

myobj = Object.create(Object);
Run Code Online (Sandbox Code Playgroud)

...我认为你的意思是这是等价的:

myobj = Object.create(Object.prototype);
Run Code Online (Sandbox Code Playgroud)

...因为:

Object.getPrototypeOf( {a:1, b:2} ) === Object.prototype;  // true
Run Code Online (Sandbox Code Playgroud)

至于为什么要null尽早使用,如果您的对象不需要 的任何属性,那么当相关对象上不存在Object.prototype属性时,尽早结束链在技术上(尽管略有提高)会加快属性查找速度。

请注意,我说“早”是因为链总是以 结尾null

Object.getPrototypeOf( Object.prototype );  // null
Run Code Online (Sandbox Code Playgroud)

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

   ^---property lookups
Run Code Online (Sandbox Code Playgroud)

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

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

如果你Object.prototype从链条中消除它,它会变得null更快一些。