我正在查看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
,我认为
答案 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
。