Javascript:对象在自己的键的function,而不是'这个'

在一个函数内引用一个对象字面值是否有问题? 这似乎工作得很好,但我想确保没有其他的影响。

这是我正在谈论的一个例子:

代替:

var obj = { key1: "it", key2: function(){return this.key1 + " works!"} }; alert(obj.key2()); 

使用:

 var obj = { key1: "it", key2: function(){return obj.key1 + " works!"} }; alert(obj.key2()); 

两者都可能是有问题的。

 var obj = { key1: "it", key2: function(){ return this.key1 + " works!" } }; var func = obj.key2; alert(func()); // error 

func不作为obj的方法调用时,可以引用其他的东西(在这里:全局对象“ window ”)。

 var obj = { key1: "it", key2: function(){ return obj.key1 + " works!" } }; var newref = obj; obj = { key1: "something else"; }; alert(newref.key2()); // "something else works" 

在这里,我们从另一个引用访问对象,尽pipe函数中的obj现在可能指向其他对象。

所以你将不得不select哪种情况更可能。 如果你真的想使它安全,你可以使用一个闭包,其中obj的作用域是不可更改的:

 var obj = (function(){ var local = { key1: "it", key2: function(){ return local.key1 + " works always!" } }; return local; })(); 

或者你bind()函数bind()到对象:

 var obj = { key1: "it", key2: function(){ return this.key1 + " works always!" } } obj.key2 = obj.key2.bind(obj); 

variables作用域绑定将会有所不同。 如果稍后修改obj,则将修改key2的返回值:

 var newobj = obj; obj = { key1: "new" }; alert(newobj.key2()); 

现在它提醒“新作品!”,因为即使你在原始对象(现在是newobj )上调用key2()obj.key1的引用现在绑定到新的obj实例的值。 使用this可以防止这种情况发生。

演示: http : //jsfiddle.net/m6CU3/

如果你不使用原型对象,你可以这样做。 因为你的对象的所有实例将返回obj实例的值…

这些技术中的任何一种或两种都可能根据情况而适用。

函数内的值取决于函数的调用方式。 如果你像这样调用一个函数作为一个对象的属性:

 obj.key2(); //or obj["key2"](); 

那么this将是那个对象。 对象是通过对象字面量还是其他方法创build的都不相关。

但是你可以使用.apply() .call().apply()来调用一个函数,并明确地将其设置为其他对象。

还要考虑:

 var obj = { key1: "it", key2: function(){return this.key1 + " works!"} }; alert(obj.key2()); // alerts "it works!" var func = obj.key2; alert(func())​; // alerts "undefined works!" 

我设置func来引用与obj.key2相同的函数,但将其称为func()不会将其设置为obj

有关更多信息,请参阅MDN this

我不认为有什么影响我的头顶。 只要确保你不会在任何时候不小心做到这一点:

 var obj = { key1: "it", key2: key1 + " works!" } 

因为这会导致错误。 除此之外,你应该好好去!