1

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!

そして第二
に、このように動作する他のオブジェクトはありますか?

4

3 に答える 3

2

の値は、関数の呼び出し方法またはFunction.prototype.bindthisによって完全に設定されます。

valueOfメソッドでは、関数オブジェクトのプロパティを定義しているため、これは関数オブジェクトを指します。

いいえ、そうではありません。関数内で、関数を定義した方法ではなく、関数を呼び出した方法のためにthis参照します。foo

> location.origin = function() {
>     return this.protocol + '//' + this.hostname;
> };
>
> location.origin.valueOf = location.origin;

locationはホストオブジェクトであることに注意してください。Safariでは、origin読み取り専用であり、上記は何もしません。

alert(typeof location.origin); // string, not function

Firefoxでの結果は異なり、OPに記載されているとおりです。

javascriptの黄金律は、「ホストオブジェクトをネイティブオブジェクトのように扱わない」です。これは、必ずしもネイティブオブジェクトのように動作するとは限らないためです。観察する動作thisは、設定方法とは関係がなく、ホストオブジェクトとそのプロパティをいじることと関係があります。

于 2012-09-21T14:08:04.583 に答える
0

foo.valueOfは、「foo」ではなく「Foobar」を指します。これはreturnthis();によるものです。//この後の括弧は、fooが実行され、その結果(= foobar)が最終的に返されることを意味します

2番目の例では、location.origin.valueOfは関数です

location.origin = function()
{
    return this.protocol + '//' + this.hostname;
};
location.origin.valueOf = location.origin();  //<-- Note the parenthesis here
location.origin.toString = function()
{
    return this();
}
console.log(location.origin() + '/uri'); //<-- again parenthesis here
console.log(location.origin.toString);// function
console.log(location.origin.valueOf);  //<-- parenthesis removed here
于 2012-09-21T14:21:07.447 に答える
0

window.locationはホストオブジェクトであるため、「ネイティブ」のJSオブジェクトのセマンティクスに従わないと思います。そのため、で行ったのと同じことを行うのに問題がありlocationますfoo

http://jibbering.com/faq/#nativeObject

于 2012-09-21T14:27:42.343 に答える