在this回答中,我指示提问者不要覆盖Javascript中的本地Object
函数,因为我认为它会搞乱对象创建过程。
然而,我考虑过这一点,并认为使用此函数实际创建所有对象的可能性与new
关键字一样。
例如,是否在使用文字符号(var a = {...}
)创建对象时使用?或者只是做this = {}
?是否可以实际为this
分配值?
我看到this问题,这是类似的,显然Object
在没有new
关键字的情况下使用时表现不同......该功能实际上是如何实现的?
答案 0 :(得分:2)
使用功能表示法获得与文字符号相同的对象。证明:
> ({}).__proto__ === new Object().__proto__
true
> new Object().__proto__ === Object.prototype
true
这意味着左侧和右侧的对象是从同一个原型创建的,即Object.prototype
答案 1 :(得分:2)
对象函数可以尝试将某个对象作为对象,如果不传递任何参数,它将构造一个null对象,因此它是一个空对象。
var a = new Object(); // a is {}
var b = new Object("1"); // b is an object which store 1 as a string.
/*
JS console says:
String
0: "1"
length: 1
*/
var c = new Object(1); // c is an object which store 1 as an integer.
/*
JS console says:
Number
//There is no other property or method here.
*/
我在没有新关键字的情况下尝试了它,并且没有任何改变。所有对象与上述对象相同。
希望这能解决你的好奇心。
答案 2 :(得分:2)
你可以在Chrome / V8中覆盖对象,如果你这样做会发生不好的事情。输入以下内容即可获得这些回复。
> Object
function Object() { [native code] }
> Number
function Number() { [native code] }
看看Number.prototype我们可以看到一整套方法和Object作为Number的原型:
Number
constructor: function Number() { [native code] }
toExponential: function toExponential() { [native code] }
toFixed: function toFixed() { [native code] }
toLocaleString: function toLocaleString() { [native code] }
toPrecision: function toPrecision() { [native code] }
toString: function toString() { [native code] }
valueOf: function valueOf() { [native code] }
__proto__: 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
Object = {}
Number的原型有点不稳定:
Number.prototype
> Number
...empty...
由于对象是层次结构的根,如果将其重新分配给另一个对象,则会有一些悖论。