0

JavaScript を使用して、プロトタイプを使用して、まだ値が与えられていない変数にメソッドを追加することは可能ですか?

たとえば、私はこれを行うことができます:

var foo = "bar";

String.prototype.doTheFoo = function(){
  console.log("foo is better than you");
};

foo.doTheFoo();

これにより、すべての文字列にメソッド doTheFoo(); が与えられます。

ただし、値が指定されていないものを使用して、同じことを行う方法はありますか?

var foo;

(????).prototype.doTheFoo = function()...

ありがとう :)

4

2 に答える 2

3

いいえ。プロトタイプ化されたメソッドは、オブジェクト コンストラクターで実行されます。のデフォルト値var fooundefined、コンストラクターを持たない です。

を拡張することで、すべてのオブジェクトにメソッドを追加できますObject.prototype

Object.defineProperty(Object.prototype, 'doTheFoo', {
    value: function() { alert('foo'); }
});

これで、オブジェクト ラッパーを持つ任意の値でメソッドを使用できるようになりました。

Object.defineProperty割り当てに使用したことに注意してください。これは、ES5 準拠の実装でのみ使用できます。プロパティを列挙不可能にするため、比較的安全です。


undefinedこれをテストの代わりに値で機能させたいと思われるので、 をテストする必要がないtypeofという事実を考慮してください。typeofundefined

これがあなたが言われたことであるなら、あなたはだまされています。多くの人がこれを考えていますが、それは彼らがいつも言われていることだからです. それは本当ではない。

次のテストは、完全に安全なテストですundefined...

if (foo === undefined) {

...次のことに注意する限り...

  1. window.undefined別の値でシャドーイングしたり定義したりしないでください

  2. #1に違反するコードは絶対に使用しないでください

  3. 宣言されていない変数の値を取得しようとしないでください

破損していない環境を維持する責任を負う(非常に単純なタスク)と、問題は発生しません。

于 2012-06-22T02:50:50.500 に答える
0

まだ持っていない車にガソリンを入れることはできますか?もちろん違います; 何かを何にも付けることはできません。

同様に、メソッドを空の変数にアタッチすることはできません。何もありません(したがって、prototype接続する必要はありません)。

技術的に言えば、宣言されているが割り当てられていない変数はundefinedであり、これは特別なプリミティブ値型です。プリミティブにはプロパティがないため、メソッドをアタッチすることはできません。

に何かを追加することもできObjectます (そこから他のprototypeすべてが継承されます)。変数に何らかの値を割り当てると、そのメソッドが使用されますが、これは非常に悪い考えです。

于 2012-06-22T02:52:30.857 に答える