11

次の 2 つの Javascript プロトタイプの機能上の違いは何ですか? また、どちらかを選択するメリットはありますか?

オプション1:

Person.prototype.sayName = function(name) {
   alert(name);
}

オプション 2:

Person.prototype = {
   sayName: function(name) {
      alert(name);
   }
}

オプション 2の結果、プロトタイプに暗黙的にバインドされている特定の関数が破棄されると想定するのは正しいですか?

4

5 に答える 5

6

オプション 2 の結果、プロトタイプに暗黙的にバインドされている特定の関数が破棄されると想定するのは正しいですか?

はい、正確に。ただし、暗黙的にバインドされるプロパティはプロパティだけですが、constructorほとんど必要ありません。

機能の違いは何ですか?

オプション 1 は、既存のプロトタイプを拡張するだけです。プロトタイプ オブジェクトから継承するインスタンスが既に存在する場合は、それらのインスタンスもメソッドPersonを使用できます。sayNameオプション 2 では、新しいプロトタイプは上書き後にインスタンス化されたオブジェクトにのみ使用されます。

どちらか一方を選択するメリットはありますか?

これらは今や自明のはずです。オプション 1 (拡張) はよりクリーンであると見なされ、外部/不明/ネイティブのプロトタイプを変更する場合は必須です。オプション 2 を避けるようにしてください。

それでもオブジェクト リテラル構文の方が気に入っている場合はObject.assign、既存のプロトタイプを拡張するために使用することを検討してください。

Object.assign(Person.prototype, {
   sayName: function(name) {
      alert(name);
   }
});

ES6 より前の環境では、ポリフィルObject.assignが必要になる場合があります。または、$.extend同様_.extendに機能します。きっとお気に入りのライブラリにも、このためのヘルパー関数が付属しています。

于 2013-07-04T16:46:54.823 に答える
3

2 つ目は person.prototype をオブジェクトで上書きします。

方法 1:

Object.toString=function(){
  return "Object to string";
}
var Person = function(){
};
Person.toString=function(){
  return "Person to string";
}
Person.prototype.sayName=function(){}
console.log(Person.prototype.constructor.toString());// "Person to string"

方法 2:

Object.toString=function(){
  return "Object to string";
}
var Person = function(){
};
Person.toString=function(){
  return "Person to string";
}
Person.prototype = {
  sayName:function(){}
}
console.log(Person.prototype.constructor.toString());// "Object to string"
于 2013-07-04T16:15:56.440 に答える
2

1 つ目は 1 つまたは 2 つの追加機能に適していますが、多くの機能を含むまったく新しいプロトタイプを定義すると、非常に反復的になります。一方、後者を行うと、あなたが言及したように、プロトタイプの既存の定義がすべて破棄されます。

実際には、Objective-C のカテゴリのように、最初の関数を使用して Array や Math などで追加の関数を定義しました。後者は「クラス定義」として使用します。

于 2013-07-04T16:04:23.607 に答える
1

コンストラクターの既存のインスタンスは、引き続き古いプロトタイプ オブジェクトを指します。作成された新しいインスタンスはすべて、新しいプロトタイプ オブジェクトを指します。


オプション 2 に対するオプション 1 の利点は、コンストラクターのプロパティを再構築する必要がなく、インデント レベルを 1 つ節約できることです。

繰り返しを省くために、プロパティをローカル変数に割り当てます。

var method = Person.prototype;

method.getAge = function() {
    return this.age;
};

method.getName = function() {
    return this.name;
};

また、一般的な選択肢はfn(jQuery) で、pこれは よりもさらに短いものmethodです。

于 2013-07-04T17:10:56.720 に答える
0

簡単に言えば、違いはPerson.prototype.sayName、関数を に追加するだけですprototype。新しい機能を追加するだけです。

ここの 2 番目Person.prototype = {}では、新しいオブジェクト全体を作成し、それを に割り当てますprototype。したがって、新しいオブジェクトを作成するか、新しいオブジェクトで上書きしprototypeます。

最初の方法は、必要に応じて多くの機能を追加するのに適しています。時間通りに一つずつ追加できるので、プログラムが単純で、アプリケーションオブジェクトがそれらの間で多くの機能やオブジェクトを共有していない場合に適していると思います.

2 番目の方法は、アプリケーション オブジェクトがいくつかのオブジェクト(または @isaach で説明した関数のグループ) を共有する場合に適しMath functionsています。

于 2013-07-04T16:39:36.773 に答える