3

私はNode.jsモジュールとCommonJSモジュールに侵入しているだけで、アプリの残りの部分を散らかすことなくStringオブジェクトを拡張し、見栄えの良いメソッドを提供しようとしています。

疑問に思っていたのですが、グローバルStringオブジェクトにメソッドをアタッチしてから、ファイルの下部にアタッチしても大丈夫deleteですか?

例えば:

// hasCondition.js

String.prototype.has = function(regex) {
    return regex.test(this);
};
exports.removeMethod = function () {
    delete String.prototype.has;
};

// someFile.js

var has = require('./hasCondition');
console.log(  "foo bar baz".has(/baz/)  );
has.removeMethod();
console.log(  "foo bar baz".has(/baz/)  );

>>> true
>>> Object foo bar baz has no method 'has'
4

2 に答える 2

1

文字列スペースを乱雑にしたくない場合は、文字列からプロトタイプ化された新しいオブジェクトを作成できます。has次に、そのオブジェクトにプロトタイプのメソッドを割り当てます。Stringに伝播しません。

このようにして、それをカプセル化します。もちろん、別の間接レイヤーを追加しますが、それはすでにデザインパターンです。

後でどこかに保管されることを心配しているのでなければhas、おそらくそうではないでしょう。追加されたメソッドを使用してStringからサブオブジェクトを生成した場合でも、hasそれが削除されると、継承からも削除されます。

その例(assertが定義されていると仮定します):

function Str1() {}
Str1.prototype = new String()
String.prototype.has = function(t) { /* code here */ }
var x = new Str1()
assert(x.has)

function Str2() {}
Str2.prototype = new Str1()

var y = new Str2()
assert(y.has)

delete String.prototype.has

assert(typeof x.has === "undefined")
assert(typeof y.has === "undefined")
于 2013-01-27T00:32:43.413 に答える
0

この場合を考えてみましょう。このモジュールを作成すると、非常に便利なので、NPMに配置して、多くの人が使用します。これらのユーザーの中には、文字列オブジェクトを拡張することが役立つと考えた人もいました。また、メソッドの1つを「has」と呼びました。

彼らがあなたのモジュールを使用するとき、それは彼らの「has」メソッドをあなたのもので上書きします。自分でクリーンアップして、追加したメソッドを削除するので、心配はいりません。あなたは次に何が起こるか知っています...彼らは彼らの方法を使おうとします、そして突然それは未定義です!

本当にあいまいな名前を付けた場合、これに遭遇する可能性はほとんどありませんが、それでも最善のアプローチではありません。一般に、コードをモジュール内にできるだけカプセル化して、リークを回避することをお勧めします。

この場合、モジュールの外部に拡張機能をリークすることを心配せずに、カスタムメソッドを使用して心ゆくまで拡張できる独自の文字列コンストラクターを作成することをお勧めします。

于 2013-01-27T00:47:40.317 に答える