Javascript 我是否可以将原型应用于js构造函数(相对于它创建的实例)?
我正试图在javascript中使用构造函数创建的对象和原型 我希望将原型应用于构造函数,以便它创建的任何对象自动继承原型。这可能吗 我似乎只能将原型应用于构造函数创建的单个实例,而不能应用于构造函数本身Javascript 我是否可以将原型应用于js构造函数(相对于它创建的实例)?,javascript,constructor,prototype,prototypal-inheritance,Javascript,Constructor,Prototype,Prototypal Inheritance,我正试图在javascript中使用构造函数创建的对象和原型 我希望将原型应用于构造函数,以便它创建的任何对象自动继承原型。这可能吗 我似乎只能将原型应用于构造函数创建的单个实例,而不能应用于构造函数本身 我的目标是这样: var animal = { speak: function(){ console.log(this.name + ' says ' + this.sound); } } var dog = function(name){ this.name =
我的目标是这样:
var animal = {
speak: function(){ console.log(this.name + ' says ' + this.sound); }
}
var dog = function(name){
this.name = name;
this.sound = 'bark';
}
dog.__proto__ = animal;
var pig = function(name){
this.name = name;
this.sound = 'oink';
}
pig.__proto__ = animal;
var percy = new pig("percy");
percy.speak();
var fido = new dog("fido");
fido.speak();
上面给出了一个错误:percy.speak不是一个函数
似乎\uuuu proto\uuuu
声明未应用于清管器
或狗
相反,它确实允许我将\uuu proto\uuu
声明直接应用于percy
或fido
:
var animal = {
speak: function(){ console.log(this.name + ' says ' + this.sound); }
}
var dog = function(name){
this.name = name;
this.sound = 'bark';
}
var pig = function(name){
this.name = name;
this.sound = 'oink';
}
var percy = new pig("percy");
percy.__proto__ = animal;
percy.speak();
这是可行的,正如预期的那样,percy说oink给了我
首先,切勿使用\uuuuuuuuuuuuuuuuuuu
。使用Object.getPrototypeOf
或Object.setPrototypeOf
\uuuuu proto\uuuu
是一个非标准访问器,如果对象不是从对象继承的,它本不应该存在,也可能无法工作。prototype
或\uuuuu proto\uu
已被隐藏。此外,更改对象的[[Prototype]]对性能有很大影响,请参见中的警告
其次,在添加方法时,不应该弄乱[[Prototype]]s
将它们添加到原型中
var animalProto={
speak:function(){console.log(this.name+'表示'+this.sound);}
};
var dog=函数(名称){
this.name=名称;
这个声音=‘吠声’;
};
dog.prototype=animalProto;
var pig=函数(名称){
this.name=名称;
this.sound='oink';
};
pig.prototype=动物原型;
var percy=新猪(“percy”);
珀西说();
var fido=新狗(“fido”);
fido.speak()代码>首先,切勿使用\uuuuuuuuuuuuuuuuuu
。使用Object.getPrototypeOf
或Object.setPrototypeOf
\uuuuu proto\uuuu
是一个非标准访问器,如果对象不是从对象继承的,它本不应该存在,也可能无法工作。prototype
或\uuuuu proto\uu
已被隐藏。此外,更改对象的[[Prototype]]对性能有很大影响,请参见中的警告
其次,在添加方法时,不应该弄乱[[Prototype]]s
将它们添加到原型中
var animalProto={
speak:function(){console.log(this.name+'表示'+this.sound);}
};
var dog=函数(名称){
this.name=名称;
这个声音=‘吠声’;
};
dog.prototype=animalProto;
var pig=函数(名称){
this.name=名称;
this.sound='oink';
};
pig.prototype=动物原型;
var percy=新猪(“percy”);
珀西说();
var fido=新狗(“fido”);
fido.speak()代码>构造函数应该是函数,而不是动物。你为什么要这样?您希望animal是构造函数创建的实例的原型,而不是构造函数本身的原型(pig.speak()
?!),所以只需像其他人一样使用dog.prototype=animal
(或dog.prototype=Object.create(animal)
)即可。构造函数应该是函数,而不是动物。你为什么要这样?您希望animal成为构造函数创建的实例的原型,而不是构造函数本身的原型(pig.speak()
?!),所以只需像其他人一样使用dog.prototype=animal
(或dog.prototype=Object.create(animal)
),这非常有用,非常感谢!你有没有可能(甚至简短地)阐述这两点的原因?因为我看到\uuuu proto\uuuu=
在其他地方的例子中使用了很多。这真的很有帮助,非常感谢!你有没有可能(甚至简短地)阐述这两点的原因?因为我看到\uuuu proto\uuuu=
在其他地方的例子中使用了很多。