2

我试图弄清楚如何将函数上下文从构造函数获取到它的原型函数之一。但是当我检查原型函数中的“this”值时,它只是将其显示为“对象”而不是调用(ctor)上下文。

所以我有代码:

function CL(){
    ...
    (stuff)
    ...
    console.log(this);
    protoFunc(this);
}

CL.prototype.protoFunc = function(context) {
  var self = context;
  console.log(context);
  ...
}

调用 protoFunc 之前的函数上下文是 CL 的上下文。但在 protoFunc 中它是 [Object object]。

如何将函数上下文放入 protoFunc?

谢谢。

莱斯

4

3 回答 3

3

你不能那样叫protoFunc,你需要this在前面。你没有报错吗?代码应该是:

function CL(){
    ...
    (stuff)
    ...
    console.log(this);
    this.protoFunc();
}

这将为您this提供原型方法内部的正确信息 - 提供CL正确调用new

var instance = new CL();
于 2013-10-02T21:22:52.767 回答
1

函数的this值由函数调用方式或使用Function.prototype.bind设置。

鉴于:

function CL(){
    console.log(this);  // a new object
    protoFunc(this);  // protoFunc doesn't exist on CL's scope chain and will throw an error
}

如果按如下方式调用 CL(并假设未使用bind ):

CL()

它的this值尚未设置,因此在非严格模式下进入函数时,它将被设置为全局(窗口)对象。在严格模式下,它将是undefined

如果使用new调用 CL :

var cl = new CL()

那么函数中的this将引用一个新对象,就像由 一样创建new Object(),即它是对实例的引用。由于这个新对象是默认返回的,并且在这里它被分配给cl,所以对构造函数的this的引用已经被保留,不需要保留任何其他引用。

请注意,对 CL 的每次调用都会创建一个全新的执行上下文。

如果您创建 CL 的实例,然后调用分配给构造函数原型的方法,例如:

cl.protoFunc()

那么protoFunc中的this将是cl

您的声明:

调用protoFunc之前的函数上下文是CL的

没有意义,大概在这里您将“上下文”与“此”混淆了。如上所述,是由调用(或绑定)设置的,因此您必须显示如何调用CL以确定将是什么。

如何将函数上下文放入 protoFunc

鉴于构造函数中的this是实例,并且函数的this值由调用设置:

cl.protoFunc()

将完成这项工作。

语境

术语“上下文”已经作为this的化名进入 ECMAScript 行话,这是不幸的。ECMA-262 将执行上下文定义为在进入函数(或新的全局环境或使用 eval 时)时创建的环境,其中包括范围链和函数的所有变量,包括其this值。您不能引用执行上下文或以任何方式访问它。

所以一个函数的上下文不仅仅是this

于 2013-10-02T22:51:34.223 回答
1

你甚至不需要这样做。尝试这个:

function CL(name) {
  //for example...
  this.name = name;
}

CL.prototype.protoFunc = function () {
  console.log(this);
};

然后你必须用你的构造函数实例化一个对象......

var x = new CL('Bob');
x.protoFunc();
//=> logs {name: 'Bob'}

如果您试图将 ACTUAL CONSTRUCTOR FUNCTION 放入您的方法中,那么您也不需要任何技巧。

CL.prototype.protoFunc = function () {
  var cTor = CL;
  console.log(cTor);
};

那是你正在寻找的东西还是你想要得到别的东西?

编辑:

如果你想在构造函数中调用原型函数,你应该这样做:

function protoFunc() {
  console.log(this);
}

function CL(name) {
  protoFunc.call(this);
}

CL.prototype.protoFunc = protoFunc;
于 2013-10-02T21:23:49.303 回答