我可以将原型应用于 js 构造函数(而不是它创建的实例)吗?
Can I apply a prototype to a js constructor (as opposed to the instances it creates)?
我试图在 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 is not a function
。
__proto__
声明似乎未应用于 pig
或 dog
。
相比之下,它确实让我将 __proto__
声明直接应用于 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 says oink
。
首先,永远不要使用__proto__
。使用 Object.getPrototypeOf
或 Object.setPrototypeOf
.
__proto__
是一个不应该存在的非标准访问器,如果您的对象不是从 Object.protoype
继承或 __proto__
已被隐藏,则它可能无法工作。此外,更改对象的 [[Prototype]] 会对性能产生很大影响,请参阅 MDN.
中的警告
其次,您不应该在添加方法时弄乱 [[Prototype]]。
改为将它们添加到 prototype
。
var animalProto = {
speak: function(){ console.log(this.name + ' says ' + this.sound); }
};
var dog = function(name){
this.name = name;
this.sound = 'bark';
};
dog.prototype = animalProto;
var pig = function(name){
this.name = name;
this.sound = 'oink';
};
pig.prototype = animalProto;
var percy = new pig("percy");
percy.speak();
var fido = new dog("fido");
fido.speak();
但使用 类:
会更干净
class Animal {
constructor(name, sound) {
this.name = name;
this.sound = sound;
}
speak() {
console.log(this.name + ' says ' + this.sound);
}
}
class Dog extends Animal {
constructor(name) {
super(name, 'bark');
}
}
class Pig extends Animal {
constructor(name) {
super(name, 'oink');
}
}
var percy = new Pig("percy");
percy.speak();
var fido = new Dog("fido");
fido.speak();
我试图在 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 is not a function
。
__proto__
声明似乎未应用于 pig
或 dog
。
相比之下,它确实让我将 __proto__
声明直接应用于 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 says oink
。
首先,永远不要使用__proto__
。使用 Object.getPrototypeOf
或 Object.setPrototypeOf
.
__proto__
是一个不应该存在的非标准访问器,如果您的对象不是从 Object.protoype
继承或 __proto__
已被隐藏,则它可能无法工作。此外,更改对象的 [[Prototype]] 会对性能产生很大影响,请参阅 MDN.
其次,您不应该在添加方法时弄乱 [[Prototype]]。
改为将它们添加到 prototype
。
var animalProto = {
speak: function(){ console.log(this.name + ' says ' + this.sound); }
};
var dog = function(name){
this.name = name;
this.sound = 'bark';
};
dog.prototype = animalProto;
var pig = function(name){
this.name = name;
this.sound = 'oink';
};
pig.prototype = animalProto;
var percy = new pig("percy");
percy.speak();
var fido = new dog("fido");
fido.speak();
但使用 类:
会更干净class Animal {
constructor(name, sound) {
this.name = name;
this.sound = sound;
}
speak() {
console.log(this.name + ' says ' + this.sound);
}
}
class Dog extends Animal {
constructor(name) {
super(name, 'bark');
}
}
class Pig extends Animal {
constructor(name) {
super(name, 'oink');
}
}
var percy = new Pig("percy");
percy.speak();
var fido = new Dog("fido");
fido.speak();