Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 原型&x27;这';不指向对象_Javascript_Node.js_This - Fatal编程技术网

Javascript 原型&x27;这';不指向对象

Javascript 原型&x27;这';不指向对象,javascript,node.js,this,Javascript,Node.js,This,我已经在堆栈上查看了类似的问题,但没有找到解决方案 我的问题是,以下代码的this没有指向相关对象,而是指向Node.JS中的环境(窗口) 我相信这是件小事,但经过大约两个小时的研究,我已经正式放弃了,是时候寻求帮助了 代码: var slice = Array.prototype.slice; function Chain(options, links) { if (!(this instanceof Chain)) return new Chain(options, slice.ca

我已经在堆栈上查看了类似的问题,但没有找到解决方案

我的问题是,以下代码的
this
没有指向相关对象,而是指向Node.JS中的
环境(
窗口

我相信这是件小事,但经过大约两个小时的研究,我已经正式放弃了,是时候寻求帮助了


代码:

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

预期:
指向
对象


结果:
指向
节点.JS中的
环境
窗口


原型设计:
我使用JSBin进行原型设计。这是那里的原型。它的效果与我的节点环境基本相同。 而不是

var chain = Chain();
这样做

var chain = new Chain();
新建关键字创建新实例


更多信息来自MDN论坛

您必须维护
快速链接的上下文:

var _ = chain.quicklink.bind(chain);
您遇到的问题是典型的:

var o = {};
o.f = function () { console.log(this); };
o.f(); //o

var f2 = o.f;
f2(); //window

使用
apply
Call
调用它,以设置预期的this并传递参数

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

这里有另一种解决这个谜题的方法(保持上下文)



应该注意的是,我已经尝试了这个方法,但结果是一样的。但是这个函数实际上返回了
新链
?它需要完整refactored@LeviRoberts. 刚刚指出了总体思路。我将编写一些我认为不需要的重构代码yours@EugeneP-如果在原始调用中没有使用new调用OP的构造函数,那么OP的构造函数将使用new调用自己,因此建议使用new调用它没有任何区别。@adeneo这不一样。看看OP是如何调用函数的<代码>变量=chain.quicklink然后
的上下文是lost@Ian-哦,我明白了@LeviRoberts为什么在调用
快速链接
函数而不调用
标识符时,希望
指向链实例?您正在
中存储对函数的引用,然后调用该函数。这与
chain.quicklink()不同
阅读更多关于
这个
关键字的信息:@LeviRoberts Right,但正如我发布的链接所解释的,调用函数在JS中与在其他语言中不同。这就是函数被区别对待的方式,这就成功了!我认为这是一个更优雅的解决方案。这绝对是优雅的,但几乎违背了向
原型添加方法的目的。这只会导致有更多的代码用于调用函数。如果将其作为属性添加到
构造函数中而不是其原型中,则可以简化它。@kapa当然,我只是想添加到对话中。我不希望你读过它,但在另一个答案的评论中,OP说他们会在几次之后调用它,并希望对函数的引用更短。你明白我说的关于将它添加到构造函数而不是原型中吗?OP可以在
函数中添加以下内容:
var me=this;me.quicklink=函数(fn){}和内部,有一个对
me
的引用,它将始终引用实例。当然,这会减少使用prototype带来的好处,但使用
bind
@Ian会失去它,这是另一种可能的方式:)。对我来说,删除
快捷方式似乎是最明智的决定,但了解JS中上下文的工作方式仍然很重要。我会说,对于程序员来说,少打字不应该是最重要的目标。@kapa当然,这是我在本页其他地方的评论中的论点…:)@LeviRoberts它还使代码无法读取。有时“更长”的代码更好,并有助于防止问题(如本例)。@LeviRoberts-如果是这种情况,你肯定是在以艰难的方式进行吗?使用一个名为
\uuu
的文本,并在其中包含所需的所有方法,这样可以保持作用域,代码也可以可读。@LeviRoberts说真的,您的代码可以是数千行,也可以是几十行;通过减少大小标识符,您不会得到任何真正的改进。如果您的目的是减小发送到浏览器的JS文件的大小,请查看缩小。如果您关心的是行长度,那么将函数调用拆分为参数声明,然后将该变量传递给函数(最后是2行更短的行)。如果您试图进行优化,这是没有帮助的。@Ian-即使这样也不会成为问题,因为这些代码从未发送到浏览器?@LeviRoberts-我想是的,我喜欢文字,因为它很容易找到内容和读取,我在节点中几乎将所有内容都写为文字,但我注意到没有其他人这样做,所以可能只有我一个人。
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');