一尘不染

Javascript:自有键功能中的对象文字引用,而不是“ this”

javascript

在函数中引用对象文字是不是很麻烦?似乎工作正常,但我想确保没有其他含义。

这是我正在谈论的示例:

代替:

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

阅读 283

收藏
2020-04-25

共1个答案

一尘不染

两者都有问题。

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);
2020-04-25