我可以将原型应用于 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__ 声明似乎未应用于 pigdog

相比之下,它确实让我将 __proto__ 声明直接应用于 percyfido

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.getPrototypeOfObject.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();