this
JavaScriptのキーワードがどのように機能するかは知っていると思いましたが、また驚きました。このスニペットを検討する:
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!
そして第二
に、このように動作する他のオブジェクトはありますか?