原型'this'并不指向对象

时间:2014-02-04 22:47:39

标签: javascript node.js this

我在堆栈上看过类似的问题,但无法提出解决方案。

我的问题是,以下代码this未指向相​​关对象,而是指向Node.JS中的environmentwindow)。

我确定这是微不足道的事情,但经过大约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

中的windowNode.JS


原型:
我使用JSBin进行原型设计。这是原型。它与我的Node环境具有基本相同的效果。 http://jsbin.com/OSaHaZAK/1/edit

4 个答案:

答案 0 :(得分:3)

使用applycall调用它来设置预期的 this 并传递参数

_.apply(chain, ['extern_var', 'something', '$callback']);

FIDDLE

答案 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');