添加到另一个原型的实例的原型:JavaScript

时间:2014-09-12 23:40:54

标签: javascript prototype

我的问题很简单:

如何设置继承自另一个类的原型的类的原型?

我的代码一直有效,直到我尝试调用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');

2 个答案:

答案 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