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!" }
因为这会导致错误。 除此之外,你应该好好去!