2016-10-07 10 views
0

私は正確に同じことをした文字列の機能のこれらの2つの例を持っている:継承されたメソッド(プロトタイプ)と静的メソッド(式)の違いは何ですか?

//ex1 - inherited method 
String.prototype.slugLower = function() { 
    return this.split(' ').join('-').toLowerCase(); 
} 

"hello World".slugLower(); 


//ex2 - static method 
String.slugLower = function(str) { 
    return str.split(' ').join('-').toLowerCase(); 
} 

String.slugLower("hello World"); 

の両方が"hello-world"を返します。それらの違いは何ですか?パフォーマンス/ベストプラクティスを意味します。

ありがとう

答えて

3

最初はプロトタイプに付けられたメソッドです。 2番目の方法は、Stringオブジェクトに添付されたメソッドです。古典的なOO言語では、それぞれ「継承メソッド」および「静的メソッド」と呼ばれます。

性能の差はごくわずかですが、ここでは重要ではありません。何があるべきです:メソッドがオブジェクトのクラス内のすべてのオブジェクトの振る舞いだと思うなら、プロトタイプ(継承)メソッドでなければなりません。クラスまたはクラス自体の複数のオブジェクトに関連する動作であると考える場合は、2番目のパターンを使用する必要があります。たとえば、「おしっこ」または「大声でこの吠え声」は、それぞれの犬の行動です。Dog.prototype.peeOnDog.prototype.barkWithVolume; "世界の犬の数は?" 「新しい犬を作る」は、それぞれの犬の行動ではなく、「犬の頃」と一対の犬の行動である:Dog.censusDog.spawnPuppy。ベストプラクティスはどちらも、あなたの例では、Stringオブジェクトを変更します。この

function slugLower(str){ 
    return str.split(' ').join('-').toLowerCase(); 
} 

を行うための関数を定義している

+0

私はクラスベースの言語で 'static'と' inherited'との比較が気に入っています。 '継承された'インスタンスがすべてのオブジェクトインスタンスによって共有されるため、類推はわずかに崩れます。しかし、まだ良い並行。 –

2

プロトタイプで定義されたメソッドは、すべてのオブジェクトで使用できます。ほとんどの場合、'your object'.protoypeがベストプラクティスになります。

別の例は:

obj1.function1 !== obj2.function1 

しかし:

obj1.function2 === obj2.function2 
0123あなたが2つのオブジェクト

var obj1 = new myObject(); 
var obj2 = new myObject(); 

を作成する場合

var myObject = function monObject() { 
    /*...*/ 

    this.function1 = function function1() { 
     /*...*/ 
    }; 
}; 

myObject.prototype.function2 = function function2() { 
    /*...*/ 
}; 

が次に次にあなたがこれを持っています

function1()は、新規作成のたびに再作成されます。myObject それは明確ですか?

+0

です私はあなたが書いたときにあなたが文字通り 'Object'を意味することを望んでいないことを願っています。「Object.protoype'がベストプラクティスになるでしょう。私は犬のおしっこ方法を 'オブジェクト'にすることを嫌い、 '犬'にする必要があります。 – Amadan

+0

(正確ではあるが)今、この答えはOPの 'ex2'の例に対処していない。 –

+0

@Amadan、はい私はあなたのオブジェクトを意味します。プロトタイプ! –

0

、いくつかの副作用があり、最初の例はinstance methodあり、もう一つはstatic function

+0

Stringオブジェクトにのみ適用できる外部関数を作成する理由 –

+0

Stringオブジェクトを変更します。ほとんどの場合、Stringインスタンスはこのメソッドを必要とせず、必要のないものを持っています。 – Byron

+2

@SandrinaPereira:ある日、ecmascript委員会はあなたのメソッドと同じ名前を持つが、完全に異なった振る舞いをする(おそらく引数を必要とするか、あるいは異なる出力を生成する)新しいメソッドをStringに導入します。理論的なことを言う前に**これまでに起こったことを覚えています:prototype.jsライブラリ。 Prototype.jsには、ネイティブオブジェクトのプロトタイプを拡張することによってjavascriptを改善できるという考えがありました。それから、es5がRuby on Railsにデフォルトで含まれていたので、非常に人気のあるBTWでした。 – slebetman

関連する問題