在构造函数中分配原型

时间:2013-04-23 15:53:38

标签: javascript

我有这段代码:

var MyClass = function(b) {
    this.a = b;
    this.getA = function() {
        return that.a;
    }
}

var SecondClass = function(b) {
    this.prototype = new MyClass(b);
    this.getB = function() {
        return 6;
    }
}

var a = new SecondClass(2);
console.log(a.getA());

输出告诉我a没有名为getA()的方法

我假设在SecondClass的构造函数中执行this.prototype = new MyClass()会导致它来自MyClass的inhert方法吗?

我确信有更好的方法可以做到这一点,但我正在尝试理解prototype关键字的行为。

2 个答案:

答案 0 :(得分:14)

prototype构造函数的特殊属性,而不是实例的特殊属性。

当您使用new Func()调用构造函数时,引擎将创建一个继承自Func.prototype的新对象,然后在构造函数内设置this以引用新对象。

因此,除了this.prototype只是一个普通的属性之外,继承已经在分配时发生了。

由于您没有为MyClass.prototype分配任何方法,因此您不必在此处对原型继承执行任何操作。您所要做的就是使用.call [MDN]MyClass应用于新创建的实例:

var SecondClass = function(b) {
    MyClass.call(this, b);
    this.getB = function() {
        return 6;
    }
};

但是,您应该add all methods that are shared by instances to the prototype然后让SecondClass的每个实例继承它。这就是完整设置的样子:

var MyClass = function(b) {
    this.a = b;
}
MyClass.prototype.getA = function() {
    return this.a;
};

var SecondClass = function(b) {
    // call parent constructor (like 'super()' in other languages)
    MyClass.call(this, b);
}
// Setup inheritance - add 'MyClass.prototype' to the prototype chain
SecondClass.prototype = Object.create(MyClass.prototype);
SecondClass.prototype.getB = function() {
    return 6;
};

var a = new SecondClass(2);
console.log(a.getA());

所有这些will become easier in ES6

答案 1 :(得分:3)

名为“prototype”的属性仅对作为函数的对象感兴趣。为构造函数中的“prototype”属性赋值不起作用(在本例中);重要的是构造函数本身的“原型”属性。

SecondClass.prototype = new MyClass();

或者其他什么。构造函数的原型对象在构造的所有实例之间共享,因此通过构造函数参数改变原型也没有多大意义。

你可以做的另一件事是从“SecondClass”中调用“MyClass”构造函数:

function SecondClass(b) {
  MyClass.call(this, b);
  this.getB = function() {
    return 6;
  };
}

这样可以使this调用中构造的new SecondClass()由“MyClass”构造函数修饰。它实际上不是继承,但你会得到一个“getA”函数。