与“new”关键字一起使用时,Object函数在Javascript中的作用是什么?

时间:2012-07-21 22:00:35

标签: javascript object

this回答中,我指示提问者不要覆盖Javascript中的本地Object函数,因为我认为它会搞乱对象创建过程。

然而,我考虑过这一点,并认为使用此函数实际创建所有对象的可能性与new关键字一样。

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

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

3 个答案:

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

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