添加到另一个原型实例的原型:JavaScript
我的问题很简单: 如何设置从另一个类的原型继承的类的原型 在我尝试调用Pierre.mySkill()之前,下面的代码一直有效,此时控制台表示函数未定义 理论上,我这样做的原因是能够创建Pirault的实例,以及Person的实例,并且能够添加到Pirault的原型中,而不必添加到Person的添加到另一个原型实例的原型:JavaScript,javascript,prototype,Javascript,Prototype,我的问题很简单: 如何设置从另一个类的原型继承的类的原型 在我尝试调用Pierre.mySkill()之前,下面的代码一直有效,此时控制台表示函数未定义 理论上,我这样做的原因是能够创建Pirault的实例,以及Person的实例,并且能够添加到Pirault的原型中,而不必添加到Person的 function Person (name, age){ this.name = name; this.age = age; } Person.prototype.info = fun
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');
组织代码,以便在创建prototype对象后定义所有prototype方法。例如:
Pirault.prototype = Object.create(Person.prototype);
Pirault.prototype.constructor = Pirault;
Pirault.prototype.mySkill = function(){
console.log('My skill is '+this.skill);
}
。目前,您在原型上正确地定义了一个方法,但当一个对象(由
object.create
创建)成为一个新的Pirault.prototype
时,您就失去了它。作为一种替代方法,您不需要构造函数来完成此操作。在现代浏览器中,您只需要对象和对象。创建:
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
那么技能就是皮埃尔?呜呜!感谢您捕捉到这一点,我想在发布之前更新它;foo.name='foo';foo={};console.log(foo.name)代码>。很明显,为什么foo.name
返回undefined
。如果所有的基本对象都是“interface”(ahem),也就是说,只包含要处理的方法,那么这种方法很有效。否则,我们也必须实例化它们,在我看来,这可能会变得混乱。不过,这是一个很好的方法,+1来自我。)一千谢谢。如果我能不止一次投你一票,我会的。你无法想象我读了多少关于类/构造函数/基于新方法的文章,我总是觉得有些东西“不太正确”…实际上,组织对象层次结构的方法不止一种-例如,mixin(Base.call(this)
)。@papiro这真是一个很长的话题,我觉得我无法在SO的回答中解释这一点(更不用说在评论中了)。不过,请注意区别:在您的例子中,您没有在pierre
上分配属性-您只是将其传递到带有Person.apply(这是参数)
行的基构造函数类中。按照这个答案中给出的方法,情况并非如此——在对象实例上设置属性是创建该实例的客户机的责任。@papiro我可以推荐您阅读Addy Osmani吗?在我看来,它很好地解释了JS中不同创作模式的差异和潜在用例。)