众所周知,使用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原型的构造函数).
而不是这个:
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更快一些。