2016-09-04 3 views
0

すべてのオブジェクトを処理できるメソッドを追加したいとします。それが機能しないプリミティブ(数値、ブール値、文字列、シンボル)上には存在しないことが好ましい。プリミティブを除くすべてのオブジェクトへのメソッド継承

これは可能ですか?あれば、どうですか?

プリミティブ型がObjectから継承するため、Object.prototypeの使用は機能しません。

+0

「作業中」を定義します。 JS内のすべてのオブジェクトのプロトタイプに表示される関数を意味しますか? –

+0

@ AsadSaeeduddinはプリミティブでは機能しないプロパティを追加します。 –

+1

私はObject.prototype.test = 1を意味します。 true.test == 1 –

答えて

3

あなたはundefinedにそれをしたくないコンストラクタのプロトタイプに対応するメンバーを設定し、その後、Objectのプロトタイプに機能を設定することができます。なぜ、私は知らない

Object.prototype.foo = function() { alert("foo"); }; 
Number.prototype.foo = undefined; 
var x = {}; 
var y = 10; 
x.foo(); // works 
y.foo(); // TypeError: y.foo is not a function 

これをやっていると、それはコードのにおいのようだが、そこに行く。

1

プリミティブはオブジェクトではなく、どこからでも継承しません。それらはObject.prototypeから継承するオブジェクトにラップすることができますが、これらはオブジェクトです。

プリミティブはプロパティを継承するように見えますが、フードの下では、プリミティブではなくオブジェクトラッパーでアクセスされます。 GetValueプロパティの参照を解決するとき、

参照のベースが原始的だったのであれば、それは、プロパティを取得しようとする前に、オブジェクトに変換されます。

@nnnnnnのように、call the methodの場合は、参照のベースが変更されなかったため、thisの値がプリミティブになります。汚いモードではオブジェクトに強制されます。実際に

何をしたいことはメソッドを呼び出すときに参照の拠点として使用されてからのプリミティブを防ぐあれば、あなたは、thisis an objectかどうか、このことの利点とテストを取ることができる:の

Object.prototype.method = function() { 
    "use strict"; 
    if(Object(this) !== this) { 
    throw Error('This method can only be called on objects'); 
    } 
    // ... 
    return "works"; 
}; 
true.method(); // Error: This method can only be called on objects 
new Boolean(true).method(); // "works" 
+1

私はこの区別を理解していますが、独自の例の 'true.self()'でも、プリミティブをとり、 'Object.prototype'のメソッドを直接呼び出すことができます。 (私は、コード内で何かを明示的に変換またはラップしていないという意味で「直接」と言っていますが、単に「動作します」。)また、あなたの関数に '' use strict '; ''を追加するとどうなるか考えてみてください。 .. – nnnnnn

0

合理化された方法メソッドをプリミティブから削除します。

Object.prototype.test = function() { } 

for(let { prototype } of [ String, Number, Boolean, Symbol ]) { 
prototype.test = undefined 
} 
関連する問題