JavaScript类继承无限循环

时间:2014-08-09 17:00:16

标签: javascript

我有以下内容:

function Person() {
  console.log('person');
}

function Player() {
  this.personConstructor();
}

Player.prototype = Person.prototype;
Player.prototype.constructor = Player;
Player.prototype.personConstructor = Person.prototype.constructor;

new Player();

意图是从Person继承到Player,然后让新的子类调用父的原始构造函数。但是,这会导致无限循环。我做错了什么,为什么循环发生?

2 个答案:

答案 0 :(得分:4)

这一行就是你的问题:

Player.prototype = Person.prototype;

您希望Player的原型来自继承<{1}}原型的,但使它们相等。目前,您的代码使PersonPlayer原型引用等于,因此对Person的任何更改也会影响Player.prototype(实际上使它们无法区分)。

您正在寻找:

Person.prototype

Object.create使用给定的原型实例化一个新对象,而不用实际调用构造函数(与常规Player.prototype = Object.create(Person.prototype); 调用不同)。这允许您获取继承new Person()原型的新对象,然后您可以根据Person的细节修改该对象。

编辑:正如Siddarth的评论中所建议的,更好的解决方案是将Player设置为property descriptor

constructor

这样,新创建的原型将使其Player.prototype = Object.create(Person.prototype, { constructor: { value: Player } }); 属性不可配置,不可枚举且不可写。这可以防止您在之后通过作业(例如constructor)意外更改它,并且它不会显示在Player.prototype.constructor = FooObject.keys循环中。通常情况下,这不是很重要,但这是一种很好的做法。

答案 1 :(得分:0)

function Person(args) {
  console.log('person');
  args=args||{};
  this.name=args.name||"no name";
}

function Player(args) {
//  this.personConstructor();
// I prefer 
  Person.call(this,args);
}

Player.prototype = Object.create(Person.prototype);
Player.prototype.constructor = Player;

console.log(new Player());
console.log(new Player({name:"Jon"}));

使用以下

重新使用Parent构造函数可能更好
Person.call(this,args);

因为如果你使用this.parent()...这样的东西,当你继承3级深度时,你会得到一个无限循环。

有关原型和构造函数的更多信息here