15

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

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

代替:

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

5 回答 5

21

两者都可能有问题。

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

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

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被交换:

// ES6 - use `const`:
const obj = {
    key1: "it",
    key2: function(){ return obj.key1 + " works always!" }
};

// ES5: use a closure where the `obj` is stored in a local-scoped variable:
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);
于 2012-05-22T22:42:30.770 回答
1

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

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

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

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

于 2012-05-22T22:33:24.893 回答
1

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

于 2012-05-22T22:35:37.777 回答
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()不设置为。thisobj

有关更多信息,请查看MDN 对this.

于 2012-05-22T22:42:51.173 回答
0

我不认为有任何影响。只要确保您在任何时候都不会意外地这样做:

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

因为这会导致错误。除此之外,你应该很高兴!

于 2012-05-22T22:31:34.003 回答