Javascript:在自己的键的函数中的对象文字引用而不是'this'

时间:2012-05-22 22:30:04

标签: javascript object

在一个函数中引用一个对象文字是否有问题,该函数是该文字的一部分?它似乎工作得很好,但我想确保没有其他含义。

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

而不是:

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());

5 个答案:

答案 0 :(得分:19)

两者都有问题。

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

func未被obj方法调用时,this可以引用其他内容(在此处:全局对象" window&#34 ;)

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

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

所以你必须选择哪种情况更有可能。如果你真的想让它变得安全,你可以使用obj作用域的封闭,但不能改变:

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

bind()对象的函数:

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

答案 1 :(得分:1)

变量范围绑定会有所不同。如果稍后修改obj,则将修改key2的返回值:

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

函数中this的值取决于函数的调用方式。如果将函数作为对象的属性调用,如下所示:

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

然后this将成为该对象。对象是通过对象文字还是其他方式创建的是不相关的。

但您可以使用.call().apply()来调用函数,并将this显式设置为其他对象。

还要考虑:

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() 设置this } obj

有关详细信息,请查看what MDN has to say about this

答案 4 :(得分:0)

我认为没有任何影响。请确保您不会在任何时候意外地执行此操作:

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

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