我的问题很简单:
如何设置继承自另一个类的原型的类的原型?
我的代码一直有效,直到我尝试调用Pierre.mySkill(),此时控制台说该函数未定义。
理论上,我的理由是能够创建Pirault的实例,以及Person的实例,并且能够添加到Pirault的原型而无需添加到Person。
function Person (name, age){
this.name = name;
this.age = age;
}
Person.prototype.info = function(){
console.log('I am '+this.name+' and I am '+this.age+' years old.');
};
function Pirault (){
this.skill = arguments[2];
Person.apply(this, arguments);
}
Pirault.prototype.mySkill = function(){
console.log('My skill is '+this.skill);
}
Pirault.prototype = Object.create(Person.prototype);
Pirault.prototype.constructor = Pirault;
var Pierre = new Pirault('Pierre', 30, 'Programming');
答案 0 :(得分:2)
组织您的代码,以便在创建原型对象之后定义所有原型方法。例如:
Pirault.prototype = Object.create(Person.prototype);
Pirault.prototype.constructor = Pirault;
Pirault.prototype.mySkill = function(){
console.log('My skill is '+this.skill);
}
Demo。就目前而言,您正确地在原型上定义了一个方法 - 但是当一个对象(由Object.create
创建)成为新的Pirault.prototype
时,它就会丢失它。
答案 1 :(得分:2)
作为替代方法,您不需要构造函数来执行此操作。现代浏览器中您只需要对象和Object.create
:
var Person = {
info: function() {
console.log('I am '+ this.name +'and I am '+ this.age +' years old.')
}
}
var Pirault = Object.create(Person)
Pirault.mySkill = function() {
console.log('My skill is '+ this.skill)
}
var pierre = Object.create(Pirault)
pierre.name = 'Pierre'
pierre.age = 30
pierre.skill = 'Programming'
pierre.mySkill() //=> My skill is Programming
console.log(Pirault.isPrototypeOf(pierre)) //=> true
console.log(Person.isPrototypeOf(pierre)) //=> true