私はDSLを構築しています。これは、JSの内部構造をハックすることができるというメリットがあります。私はこれが一般的なJSの使用法では非常に悪い考えであると理解していますが、私の目的のためには大丈夫です。次のコードは正常に動作します:JavaScriptの `String.prototype.valueOf`を置き換える
var str = new String("blah");
str.valueOf = function() { return 10 }
console.log(str * 10); // outputs 100
しかし、これはしていません:
var str = "blah";
str.valueOf = function() { return 10 }
console.log(str * 10); // outputs NaN (because str === "blah")
内部を理解し、誰かが少しここで何が起こっているか説明できますか?これら2つの例の根本的な違いは何ですか?
それでは、文字列プロトタイプ自体を変更したい場合、valueOf
メソッドをのすべての文字列に設定することができます。これは可能ですか?残念ながら、これは動作していないよう:
String.prototype.valueOf = function() { return 10 }
console.log("blah" * 10); // NaN
これがするけど:
String.prototype.valueOf = function() { return 10 }
console.log(new String("blah") * 10); // 100
なぜJSエンジンは異なっ"blah"
とnew String("blah")
を扱うん:
String.prototype.valueOf = function() { return 10 }
console.log("blah".valueOf() * 10); // 100
そしてそうで、このしていますか?ありがとう!
ちなみに、here is a good articleそのようなものは私にこのようなものを探求させました。
"メソッドがプリミティブ文字列またはプロパティルックアップで呼び出されるコンテキストでは、JavaScriptは自動的に文字列プリミティブをラップし、メソッドを呼び出したりプロパティルックアップを実行します。 - 非常に卑劣です!しかしそれは理にかなっています。素晴らしい答え、感謝:) – JoeRocc