这有效:
function Bird(name){
Animal.call(this,name);
this.speak = function(){
console.log("Tweeet!");
}
}
Bird.prototype.constructor = Animal;
这会引发"无法设置属性'构造函数'未定义"
function Bird(name){
Animal.call(this,name);
this.speak = function(){
console.log("Tweeet!");
}
this.prototype.constructor = Animal;
}
为什么会这样?在第二个例子中,这个应该是 Bird ,因为我用 new 调用了函数,所以我应该能够设置<的原型此即可。我在这里缺少什么?
答案 0 :(得分:2)
Object
个实例(this
)没有prototype
属性,因此this.prototype
会返回undefined
。
您有两种方法可以解决这个问题:
按照您在第一个代码段中的操作调用Bird.prototype
:
function Bird(name){
Animal.call(this,name);
this.speak = function(){
console.log("Tweeet!");
}
Bird.prototype.constructor = Animal;
}
使用Object.getPrototypeOf
来获取对象的原型:
function Bird(name){
Animal.call(this,name);
this.speak = function(){
console.log("Tweeet!");
}
Object.getPrototypeOf(this).constructor = Animal;
}
当您不知道对象的类型时,选项2会更有用。在您的示例中,您位于Bird
类中,因此选项1更有意义。
以下是一个有用的示例,希望您的评论中的问题更加清晰:
// 1. Tell Javascript what an Animal is
// This will create an Object called Animal, but it is a blueprint not an actual Animal.
function Animal(name)
{
this.name = name;
}
// 2. Tell Javascript what a Bird is
// This will create an Object called Bird, but it is a blueprint not an actual Bird. So it cannot speak!
// or function Bird(name){
var Bird = function(name){
Animal.call(this,name);
this.speak = function(){
alert("Tweeet! said " + this.name);
}
Object.getPrototypeOf(this).constructor = Animal;
};
// 3. Now create an actual Bird which can speak
var tweety = new Bird("Tweety Pie");
tweety.speak();
&#13;