关于原型继承的一个令人困惑的案例

时间:2017-04-06 03:20:58

标签: javascript oop inheritance

我正在学习JS OOP的东西,给我发现了一个令人困惑的案例。在下面的代码片段中,我使用Object.create方法来实现继承。

function Parent(){
    this.name = "wang";
}
function Child(){
   this.age = 28;
}

Child.prototype = Object.create(Parent.prototype)
var mychild = new Child();
console.log(mychild.name)

mychild.name未定义。

但是我使用new Parent()来做继承部分,它可以如下工作:

function Parent(){
    this.name = "wang";
}
function Child(){
    this.age = 28;
}

Child.prototype = new Parent();
var mychild = new Child();
console.log(mychild.name)

我曾经读过一些教程,其中说实际上Object.create方法是正确的方法。那我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

你的第一个例子对于继承是正确的,但重要的是要注意你没有在新创建的Parent实例上调用Child函数。

为此,您可以使用callapply

function Child() {
  Parent.call(this)
  this.age = 28
}

function Parent(){
    this.name = "wang";
}
function Child(){
    Parent.call(this);
    this.age = 28;
}

Child.prototype = Object.create(Parent.prototype);
var mychild = new Child();
console.log(mychild.name);

如果您使用的是ES2015,则可以使用class来简化代码:

class Parent {
  constructor() {
    this.name = "wang"
  }
}
class Child extends Parent {
  constructor() {
    super()
    this.age = 28
  }
}

const mychild = new Child()
console.log(mychild.name)

请注意,在后面的示例中,super取代Parent.call(this)