2016-11-24 11 views
1

たとえば、文字列に 'foo'を追加する必要があります。Object.prototypeの拡張機能として機能を定義する前に考えるべきことは?

私は少なくとも2つの方法があります。

まず、私はString.prototype.fooを実装することができます。

String.prototype.foo = function() { 
    return this + 'foo'; 
}; 

var s = 'str'; 
var data = s.foo(); // "strfoo" 

別の方法:

function foo(str) { 
    return str + 'foo'; 
} 

var s = 'str'; 
var data = foo(s); // "strfoo" 

どちらがきれいに見えます。しかし、私は最初のまたは2番目の実装を選択する前に、 "水中の岩"について考えるべきですか?効率性やパフォーマンスなどの重要な理由はありますか?

+0

両方..あなたは 'this'コンテキストを使用しているが、後の例では、引数を使用している:ここでは

function MyString(str) { this.str = str; } MyString.prototype.foo = function() { return this.str + "foo" }; var s = new MyString("str"); var data = s.foo(); // "strfoo" 

はさらにグローバルオブジェクトと欠点を修正することについて読んでいる

あなたがしていることを知っている限り、練習は大丈夫です.. – Rayon

答えて

1

最初のは、文字列の機能を拡張します。 オブジェクトのクラスがあり、新しいビヘイビアを追加する場合は、このソリューションを使用します。

もう1つはです。ユーティリティー機能です。 文字列ではない変数にも2番目のfooを適用することができるので、使用法をString引数に限定したい場合は、引数の型もテストする必要があります。

1

JavaScriptでグローバル変数を変更することは常に悪い判断です。 polyfillを作っていない場合を除いて、そうしないでください。

この意味は、コードが移植性がないことから、他人のコードを壊す可能性があることから複数です。

私は常に第2の方法を使用します。または、事が本当に複雑なのであれば、私のクラスのStringを実装することもできます。最初の例では

https://softwareengineering.stackexchange.com/questions/104320/why-is-extending-the-dom-built-in-object-prototypes-a-bad-idea

関連する問題