thisJavaScriptのキーワードがどのように機能するかは知っていると思いましたが、また驚きました。このスニペットを検討する:
function foo()
{
return 'Foobar';
}
foo.valueOf = function()
{
return this();//this points to foo
};
foo.toString = foo;//alternatively
console.log(foo + '');//logs Foobar as you'd expect
valueOfメソッドではthis、関数オブジェクトのプロパティを定義しているため、関数オブジェクトを指します。locationしかし、オブジェクトで同じことをしようとすると、次のようになります。
location.origin = function()
{
return this.protocol + '//' + this.hostname;
};
location.origin.valueOf = location.origin;
location.origin.toString = function()
{
return this();
}
console.log(location.origin + '/uri');//undefined//undefined/uri ?
console.log(location.origin.toString());//undefined//undefined ?
console.log(location.origin.valueOf());//undefined//undefined ?
これを機能させる唯一の方法は、に変更this()することlocation.origin()です。誰かがlocationオブジェクトの何がそんなに違うのか説明できますか?プロパティとメソッドを自由に割り当てることができますが、Locationコンストラクターとそのプロトタイプが他のプロトタイプほど「アクセス可能」ではないことに気づきました。Chromeではを使用する必要がありますが Object.getPrototypeOf(location);、FFでは使用できますLocation.prototype。
基本的に、私は2つの質問があります:上記
のものとの違いは何ですか:location.origin
var foo = {bar:function(){return 'Foobar';}};
foo.bar.valueOf = function(){return this();};
console.log(foo.bar + '');//logs Foobar!
そして第二
に、このように動作する他のオブジェクトはありますか?