众所周知,使用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
原型的构造函数。)
答案 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
。