すべてのオブジェクトを処理できるメソッドを追加したいとします。それが機能しないプリミティブ(数値、ブール値、文字列、シンボル)上には存在しないことが好ましい。プリミティブを除くすべてのオブジェクトへのメソッド継承
これは可能ですか?あれば、どうですか?
プリミティブ型がObjectから継承するため、Object.prototypeの使用は機能しません。
すべてのオブジェクトを処理できるメソッドを追加したいとします。それが機能しないプリミティブ(数値、ブール値、文字列、シンボル)上には存在しないことが好ましい。プリミティブを除くすべてのオブジェクトへのメソッド継承
これは可能ですか?あれば、どうですか?
プリミティブ型がObjectから継承するため、Object.prototypeの使用は機能しません。
あなたは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
これをやっていると、それはコードのにおいのようだが、そこに行く。
プリミティブはオブジェクトではなく、どこからでも継承しません。それらはObject.prototype
から継承するオブジェクトにラップすることができますが、これらはオブジェクトです。
プリミティブはプロパティを継承するように見えますが、フードの下では、プリミティブではなくオブジェクトラッパーでアクセスされます。 GetValueプロパティの参照を解決するとき、
- 場合HasPrimitiveBase(V)を
- 戻りベース。[取得](GetReferencedName(V)、GetThisValue(V))。
参照のベースが原始的だったのであれば、それは、プロパティを取得しようとする前に、オブジェクトに変換されます。
@nnnnnnのように、call the methodの場合は、参照のベースが変更されなかったため、this
の値がプリミティブになります。汚いモードではオブジェクトに強制されます。実際に
何をしたいことはメソッドを呼び出すときに参照の拠点として使用されてからのプリミティブを防ぐあれば、あなたは、this
値is 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"
私はこの区別を理解していますが、独自の例の 'true.self()'でも、プリミティブをとり、 'Object.prototype'のメソッドを直接呼び出すことができます。 (私は、コード内で何かを明示的に変換またはラップしていないという意味で「直接」と言っていますが、単に「動作します」。)また、あなたの関数に '' use strict '; ''を追加するとどうなるか考えてみてください。 .. – nnnnnn
合理化された方法メソッドをプリミティブから削除します。
Object.prototype.test = function() { }
for(let { prototype } of [ String, Number, Boolean, Symbol ]) {
prototype.test = undefined
}
「作業中」を定義します。 JS内のすべてのオブジェクトのプロトタイプに表示される関数を意味しますか? –
@ AsadSaeeduddinはプリミティブでは機能しないプロパティを追加します。 –
私はObject.prototype.test = 1を意味します。 true.test == 1 –