6

次のような文字列にメソッド x を実装した場合:

String.prototype.x = function (a) {...}

そして、JavaScriptの新しいバージョンは実際にxメソッドを実装しますが、別の方法で、私の実装とは異なる何かを返すか、私の実装よりも多い/少ない引数を持つ関数を返します。これは私の実装を壊してオーバーライドしますか?

4

4 に答える 4

3

デフォルトの実装を上書きします。

それを使用するコードは、代わりにあなたのものを使用します。

範囲指定された拡張メソッドの提案がありましたが、JS エンジンに実装するには計算コストが高すぎるため、却下されました。この問題に対処するための新しい提案 (プロトコル) についての話があります。ES6 シンボルもそれを回避する方法を提供します (ただし、構文は醜いです)。

しかし、それはパンチではありません- 誰も教えてくれない楽しい事実があります.

x呼び出されたメソッドを実装する人は誰もいませんString.prototype

あなたはそれを実装し、それを回避することができます. 真剣に、prollyfillingpolyfillingは、多くのユースケースに対する実行可能で表現力豊かな興味深いソリューションです。ライブラリを作成していない場合は、許容できると思います。

于 2013-11-13T22:37:57.693 に答える
2

いいえ、宣言/定義した時点から、上記の関数のデフォルトの実装をオーバーライドします。「新しい」実装は、実装が定義されるまで、ネイティブの動作で機能します。

var foo = 'some arbitrary string';

console.log(foo.indexOf('s')); // logs [0]

String.prototype.indexOf = function(foo, bar) { return 'foo'; };

console.log(foo.indexOf()); // logs [foo]

イラスト: http: //jsfiddle.net/Z4Fq9/

于 2013-11-13T22:23:28.177 に答える
1

コードはデフォルトの実装をオーバーライドします。

ただし、メソッドのインターフェイスが標準のものと互換性がない場合、使用できるライブラリは標準の動作に依存する可能性があるため、プログラム全体がライブラリの新しいバージョンで壊れる可能性があります。

一般に、他の人が同じことをすると壊れる可能性のあることをするのは悪い考えです。別のライブラリがx、標準の文字列オブジェクト プロトタイプにメソッドを追加するのが良い考えだと考えたらどうしますか? 競合を回避しようとすることは、ライブラリにとって必須ですが、アプリケーションにとっても良いことです (そして、アプリケーションが適切に書かれている場合、そのコードの多くはおそらくライブラリに非常に似ており、後でライブラリで進化する可能性があります)。

この種の「パッチ適用」は、メソッドが存在しない壊れたまたは古い JavaScript 実装の標準メソッドを提供する場合にのみ意味があります。パッチを適用できるという理由だけで標準プロトタイプにパッチを適用するのは悪い考えであり、コードをページの共有が困難な悪い隣人にすることになります。

于 2013-11-13T22:40:16.330 に答える
0

x の実装が Javascript の新しいバージョンからのものである場合、それはコアの一部であるため、記述時String.prototype.x...に既にそこにあり、上書きします。

この種のベストプラクティスは、次のように書くことです

if( !String.prototype.x ){
  String.prototype.x = function ...
    //your 
于 2013-11-13T22:34:42.083 に答える