2

http://jsfiddle.net/javascriptenlightenment/QvbDw/のコード スニペットでは、作成者は組み込みの String オブジェクト コンストラクターを 2 つの新しいプロパティ (配列プロパティと関数プロパティ) で拡張しています。

私は、新しい配列プロパティに対して、彼がこれを行ったことに気付きました:

String.newArrayProperty = [];
// Q1: Why not String.prototype.newArrayProperty = []; ?

しかし、新しい関数プロパティについては、次のようにしました。

String.prototype.newFunctionProperty = function() {...};
// Q2: Why not String.newFunctionProperty = function() {...}; ?

String.newProperty と String.prototype.newProperty の違いは何ですか?

4

3 に答える 3

5

String.newPropertyネイティブ関数に新しいプロパティを追加Stringしますが、そのプロパティは生成される文字列に継承されませんが、String.prototype.newProperty生成されるすべての文字列に新しいプロパティが追加されますが、ネイティブ関数自体には継承されません。

于 2012-08-24T07:20:23.533 に答える
2

String.propertyオブジェクトに関してproperytoクラスにアドバタイズし、このプロパティをこのクラスのすべてのインスタンスに追加します。StringString.prototype.property

function F() {
}

F.p1 = function () { console.log('F.p1'); } ;
F.prototype.p2 = function () { console.log('F.prototype.p2'); } ;

F.p1(); // 'F.p1'
F.p2(); // error
new F().p1(); // error
new F().p2(); // 'F.prototype.p2'

また見てください:

  1. JavaScript .prototypeはどのように機能しますか?
  2. http://www.w3schools.com/jsref/jsref_prototype_math.asp
  3. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/prototype
于 2012-08-24T07:19:14.570 に答える
0

のプロトタイプに割り当てられたメソッドは、StringString のすべてのインスタンスに適用できます。Stringコンストラクターに割り当てられたメソッドは、パラメーターとして文字列を使用して静的メソッドとして呼び出す必要があります。メソッドがプロトタイプ内にある場合、その中でthis、文字列インスタンスを参照します。

そう:

String.prototype.insertLineNr = function(nr){return (nr||1) + ': ' +this;};
//                                                                  ^instance
String.insertLineNo = function(str,nr){return (nr||1) + ': ' +str;};
var str = 'Some line to be numbered';
//apply to instance
console.log(str.insertLineNr(5);        //=> '5: Some line to be numbered'
//can't apply direct String method to instance 
console.log(str.insertLineNo(str,5));   //=> TypeError
//Run String method 
console.log(String.insertLineNo(str,5); //=> '5: Some line to be numbered'

メソッド名が等しい場合、両方の長所を活かすことができます。

function insrtNr(str,nr){ return (nr||1) + ': ' + str || this;};
String.insertLineNr = insrtNr;
String.prototype.insertLineNr = insrtNr;
于 2012-08-24T08:10:27.903 に答える