7

JavaScript では、何か特別なことがあるのだろうか、newそれとも単にcall(). 次のようなコンストラクタがある場合:

function Person ( name, age ){
    this.name = name;
    this.age = age;
}

var bob = new Person( "Bob", 55 );

とは異なる

var bob;
Person.call( bob = new Object(), "Bob", 55 );

?

4

6 に答える 6

3

bobから継承しないためPerson.prototype(から直接継承するため)、これらはあなたの例では同等ではありませんObject.prototype

同等のバージョンは

Person.call(bob = Object.create(Person.prototype), "Bob", 55 );

シンタックスシュガーですか?定義の仕方にもよるかもしれません。

Object.createは以前の JS バージョンでは利用できなかったため、オブジェクトの継承を設定することはできませんでした(一部のブラウザーではオブジェクトの内部プロパティnewを上書きできますが、これは本当に悪い習慣です)。__proto__


参考までに、 http://es5.github.com/#x11.2.2http://es5.github.com/#x13.2.2newに仕組みが定義されています。http://es5.github.com/#x15.2.3.5に記載されています。Object.create

于 2013-01-29T16:06:17.573 に答える
2

いいえ、単なるシンタックス シュガーでnewはありません。それどころか、JavaScript では場合によってはコンストラクターを呼び出すことができるため、新しいインスタンスを構築するために機能します (そして機能するだけです) Person.callnew

于 2013-01-29T15:46:54.233 に答える
2

いいえ。

call()キーワードはプロトタイプからオブジェクトを初期化するのapply()に対し、関数を呼び出すだけです (「 」も参照)。new

プロトタイプ コンストラクターが関数であることは事実ですが、これは特殊なケースです。

于 2013-01-29T15:47:02.083 に答える
2

いいえ、ちがいます。最初の例では、実際に Person を作成しています。

bob instanceof Person == true

他の例では...

bob instanceof Person == false
于 2013-01-29T15:48:27.267 に答える
1

型のインスタンスを作成するポイントは、通常はプロトタイプを介して、いくつかの動作を共有することです。

関数を追加するとします:

Person.prototype.doSomething = function(){
   ...
}

この場合、この関数は、を使用して作成したオブジェクトではなく、をPerson使用して作成したすべてのオブジェクトで使用できます。newcall

MDNには、プロトタイプの使用に関する優れた入門書があります

于 2013-01-29T15:50:13.567 に答える
1

new呼び出すと、コンストラクターとして関数が呼び出されます。これにより、JavaScriptに「新しい」Personオブジェクトを作成し、その新しいオブジェクトを。として設定して関数を呼び出すように指示しますthis

2番目の例では、関数を通常どおりに呼び出し、手動で(または単に)に設定thisしています。そのため、関数が実行され、送信したオブジェクトのプロパティが設定されます。(やってみて、それから)new Object{}thisPerson( "Bob", 55 );console.log(window.name)

最初の例でbobは、はPersonオブジェクトです。しかし、2番目では、それはObjectです。

ですから、いや、一方が他方に不足しているわけではありません。彼らは違う。

于 2013-01-29T15:51:43.887 に答える