gpt4 book ai didi

javascript - 如何在单例模式中保留 javascript "this"上下文?

转载 作者:数据小太阳 更新时间:2023-10-29 04:47:35 26 4
gpt4 key购买 nike

我有类似的东西:

var a = (function () {

return {

b: 1,
c: function () {

console.log(this.b);
}
};
})();

所以,

a.c(); // = 1

但如果我这样做

b = 2;
a.c.apply(this); // = 2

是否有可能在不改变(太多)“a”对象的结构的情况下在“a.c()”中保留“this”的上下文?我无法控制函数的调用,因此我需要一种变通方法来在对象本身内部处理此问题。

更新:

更具体地说,这是我的文件结构:

结构一(类单例模式):

var a = (function () {

var _instance;

function init() {

return {

b: 1,
c: function () {

console.log(this.b);
}
};
}

return {

getInstance: function () {

if (_instance === undefined) {
_instance = init();
}

return _instance;
}
}
})();

结构二:

var b = {

c: 1,
d: function () {
console.log(this.c);
}
};

解决方案:

我已经根据 Mahout 的回答实现了一个解决方案,在 init() 中拆分 return 语句,因此在任何情况下它对对象上下文(和实例)都是安全的。

对于单例模式:

var a = (function () {

var _instance,
self;

function init() {

return self = {

b: 1,
c: function () {

console.log(self.b);
}
};
}

return {

getInstance: function () {

if (_instance === undefined) {
_instance = init();
}

return _instance;
}
};
})();

对于对象字面量:

var b = (function () {

var self;

return self = {
c: 1,
d: function () {
console.log(self.c);
}
};
})();

所以

a.getInstance().c(); // 1
a.getInstance().c.apply(this); // 1
setTimeout(a.getInstance().c, 1); // 1
$.ajax({ complete: a.getInstance().c }); // 1

最佳答案

您可以稍微更改从匿名函数返回对象的方式:

var a = (function () {
var result = {};
result.b = 2;
result.c = function() {
console.log(result.b);
};
return result;
})();

这应该具有相同的效果,但是它确实删除了 this 的使用。

如果您无法承受如此大的改变 a 的结构,那么您可以(更)更危险地使用:

a.c.apply = function() { // Stops the apply function working on a.c by overriding it
return a.c();
}

如果您选择此选项,您必须警惕任何时候使用 a.c.apply 它将不再“按预期”工作 - 虽然它会解决此处出现的问题。

关于javascript - 如何在单例模式中保留 javascript "this"上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32104417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com