我正在学习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
方法是正确的方法。那我的代码出了什么问题?
答案 0 :(得分:1)
你的第一个例子对于继承是正确的,但重要的是要注意你没有在新创建的Parent
实例上调用Child
函数。
为此,您可以使用call
或apply
:
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)
。