我有以下内容:
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
,然后让新的子类调用父的原始构造函数。但是,这会导致无限循环。我做错了什么,为什么循环发生?
答案 0 :(得分:4)
这一行就是你的问题:
Player.prototype = Person.prototype;
您希望Player
的原型来自继承<{1}}原型的,但不使它们相等。目前,您的代码使Person
和Player
原型引用等于,因此对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 = Foo
或Object.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。