Javascript 我是否可以将原型应用于js构造函数(相对于它创建的实例)?

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 =

我正试图在javascript中使用构造函数创建的对象和原型

我希望将原型应用于构造函数,以便它创建的任何对象自动继承原型。这可能吗

我似乎只能将原型应用于构造函数创建的单个实例,而不能应用于构造函数本身


我的目标是这样:

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=
在其他地方的例子中使用了很多。