我以为我知道 JavaScript 的this
关键字是如何工作的,但我又被吓了一跳。考虑到这个片段:
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
。
基本上,我有两个问题:上面
的location.origin
东西和:
var foo = {bar:function(){return 'Foobar';}};
foo.bar.valueOf = function(){return this();};
console.log(foo.bar + '');//logs Foobar!
其次
,还有其他类似行为的对象吗?