我在堆栈上看过类似的问题,但无法提出解决方案。
我的问题是,以下代码this
未指向相关对象,而是指向Node.JS中的environment
(window
)。
我确定这是微不足道的事情,但经过大约2个小时的研究后,我已经正式放弃了,现在是时候寻求帮助了。
的代码:
var slice = Array.prototype.slice;
function Chain(options, links) {
if (!(this instanceof Chain)) return new Chain(options, slice.call(arguments));
return this;
}
Chain.prototype.quicklink = function quicklink(fn) {
console.log(this);
};
var Chain = require('./chains');
var chain = Chain();
var _ = chain.quicklink;
_('extern_var', 'something', '$callback');
的预期:
this
指向Chain
对象。
的结果:
this
指向environment
window
或Node.JS
的原型:
我使用JSBin进行原型设计。这是原型。它与我的Node环境具有基本相同的效果。
http://jsbin.com/OSaHaZAK/1/edit
答案 0 :(得分:3)
答案 1 :(得分:2)
您必须维护quicklink
的上下文:
var _ = chain.quicklink.bind(chain);
你遇到的问题很经典:
var o = {};
o.f = function () { console.log(this); };
o.f(); //o
var f2 = o.f;
f2(); //window
答案 2 :(得分:1)
而不是
var chain = Chain();
这样做
var chain = new Chain();
新关键字创建新实例。
来自MDN论坛的更多信息。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
答案 3 :(得分:0)
这是解决这个谜题的另一种方法(维护上下文)。
var slice = Array.prototype.slice;
function Chain(options, links) {
if (!(this instanceof Chain)) return new Chain(options, slice.call(arguments));
return this;
}
Chain.prototype.quicklink = function quicklink() {
var args = arguments;
console.log(args);
};
var chain = Chain();
function _() {
var args = slice.call(arguments);
chain.quicklink.apply(chain, args);
}
_('extern_var', 'bob', '$callback');