2

这个答案中,我指示提问者不要Object在 Javascript 中覆盖本机函数,因为我认为它会弄乱对象创建过程。

但是后来,我想了想,发现所有对象都不太可能实际上是使用这个函数和new关键字创建的。

例如,当使用文字符号 ( var a = {...}) 创建对象时是否使用它?或者它只是这样做this = {}?是否可以实际分配值this

我看到了这个问题,很相似,并且Object在没有关键字的情况下使用时显然表现不同new......该功能实际上是如何实现的?

4

3 回答 3

2

使用文字表示法获得的对象与使用功能表示法获得的对象相同。证明:

> ({}).__proto__ === new Object().__proto__
true
> new Object().__proto__ === Object.prototype
true

这意味着左侧和右侧的对象是从同一个原型创建的,即 Object.prototype

于 2012-07-21T22:24:24.277 回答
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.
*/

我在没有new关键字的情况下尝试了它,但没有任何改变。所有对象与上述对象相同。

希望这能解决你的好奇心。

于 2012-07-21T22:24:42.297 回答
2

你可以覆盖 Chrome/V8 中的 Object,如果你这样做了,就会发生不好的事情。键入以下内容将获得这些响应。

> 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...

由于 Object 是层次结构的根,因此如果将其重新分配给另一个对象,则会出现一些悖论。

于 2012-07-21T22:29:59.843 回答