即使使用`bind`,`this`也成为超级构造函数中的窗口

时间:2017-08-19 10:58:16

标签: javascript

我是Javascript的新手。当我做一些面向目标的编程时,我想在子类中调用超类的构造函数:

function P(p1, p2) {
  alert(this);
  this.v1 = p1;
  this.v2 = p2;
}

var middleObj = function() {};
middleObj.prototype = P.prototype;

var C = function(p1, p2) {
    P.bind(this, p1, p2);
    P();
}
C.prototype = new middleObj();
C.prototype.constructor = C;

var objChild = new C(1,2);
alert(objChild instanceof P);
alert(objChild.v2);

如果我直接在C()中调用P(),则转向window,我可以理解。但是,即使我将其绑定到C(),仍然无法获得this的正确值。因此,第二个警报将显示未定义,因为v2未正确初始化。

1 个答案:

答案 0 :(得分:1)

P.bind()会返回一个功能,您需要再次将其分配给P。喜欢这个

 P = P.bind(this, p1, p2)

但在这种情况下,我建议你只使用P.call(this, p1, p2);



function P(p1, p2) {
  alert(this);
  this.v1 = p1;
  this.v2 = p2;
}

var middleObj = function() {};
middleObj.prototype = P.prototype;

var C = function(p1, p2) {
    P.call(this, p1, p2);
}
C.prototype = new middleObj();
C.prototype.constructor = C;

var objChild = new C(1,2);
alert(objChild instanceof P);
alert(objChild.v2);