2

この回答では、Javascript でネイティブ関数を上書きしないように質問者に指示しました。これObjectは、オブジェクトの作成プロセスが台無しになると考えたからです。

しかし、考えてみると、すべてのオブジェクトが実際にこの関数とnewキーワードを使用して作成されている可能性はほとんどないことがわかりました。

たとえば、オブジェクトをリテラル表記 ( var a = {...}) で作成する場合に使用されますか? それとも単にそうするのthis = {}ですか?実際に値を割り当てることthisはまったく可能ですか?

私はこの質問を見ました。これは似ていますがObject、キーワードなしで使用すると明らかに異なる動作をしnewます...関数は実際にどのように実装されていますか?

4

3 に答える 3

2

Chrome/V8 では Object を上書きできますが、そうすると悪いことが起こります。次のように入力すると、これらの応答が得られます。

> Object
 function Object() { [native code] }
> Number
 function Number() { [native code] }

Number.prototype を見ると、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 = {}

Number のプロトタイプは少し不安定です。

Number.prototype
   > Number

  ...empty...

オブジェクトは階層のルートであるため、別のオブジェクトに再割り当てすると、少し矛盾が生じます。

于 2012-07-21T22:29:59.843 に答える
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.
*/

新しいキーワードなしで試してみましたが、何も変わりませんでした。すべてのオブジェクトは上記のものと同じです。

これがあなたの好奇心を解決することを願っています。

于 2012-07-21T22:24:42.297 に答える