0

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

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

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

Employee.prototype = Person.prototype;

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

为什么?控制台记录原型告诉我 1 withObject.create()会给 Employee.prototype 1 更多的级别__proto__Person.prototype我认为

4

1 回答 1

2

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

Employee.prototype = Person.prototype;

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

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


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

将创建一个新对象,类似于

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

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

Employee.prototype = new Person();

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


小提琴中的无限循环发生是因为Employee.prototype.sayHi调用Person.prototype.sayHi, but Employee.prototype.sayHi is Person.prototype.sayHi,因此它调用自身Person.prototype.sayHi(当您分配给 时,原始文件丢失了Employee.prototype.sayHi)。

如果Employee.prototype === Person.prototype那时,必然,Employee.prototype.sayHi === Person.prototype.sayHi

于 2012-12-05T10:26:08.357 回答