JavaScript继承(使用超类函数时的无限循环)

时间:2012-12-05 10:07:12

标签: javascript oop

我正在查看Tuts + OO JavaScript培训:他们进行原型继承的方式如下:

Employee.prototype = Object.create(Person.prototype);

但为什么我不能做(没有对象创建)

Employee.prototype = Person.prototype;

第二个将给出无限循环:http://jsfiddle.net/VMqSy/

为什么呢?记录原型的控制台告诉我,带有Object.create()的1将为Employee.prototype 1提供更多__proto__Person.prototype,我认为

1 个答案:

答案 0 :(得分:2)

如果你这样做(如小提琴所示)

Employee.prototype = Person.prototype;

然后Employee将不是Person的子类,而是它们将成为同一个类(尽管有两个不同的构造函数)。

更准确地说,您添加到Employee原型的方法和属性对于任何Person也是可见的。请注意,OOP中的类不应以任何方式影响其超类。


Employee.prototype = Object.create(Person.prototype);

将创建一个新的Object,类似于

Employee.prototype = {};
Employee.prototype.__proto__ = Person.prototype

除了Object.create(与__proto__不同)适用于所有浏览器或

Employee.prototype = new Person();

除了Person的构造函数还可以为Employee.prototype设置其他属性,而Object.create将创建一个没有额外属性的对象。


你的小提琴中的无限循环发生是因为Employee.prototype.sayHi调用Person.prototype.sayHi,但Employee.prototype.sayHi Person.prototype.sayHi,因此它调用本身(原来的Person.prototype.sayHi在您分配到Employee.prototype.sayHi时失去了。

如果Employee.prototype === Person.prototype那么,必须Employee.prototype.sayHi === Person.prototype.sayHi