了解JavaScript中的原型继承我是JavaScript OOP的新手。你能解释下面的代码块之间的区别吗?我测试了两个块都有效。什么是最佳实践,为什么?第一块:function Car(name){
this.Name = name;}Car.prototype.Drive = function(){
console.log("My name is " + this.Name + " and I'm driving.");}SuperCar.prototype = new Car();SuperCar.prototype.constructor = SuperCar;function SuperCar(name){
Car.call(this, name);}SuperCar.prototype.Fly = function(){
console.log("My name is " + this.Name + " and I'm flying!");}var myCar = new Car("Car");myCar.Drive();var mySuperCar = new SuperCar("SuperCar");mySuperCar.Drive();mySuperCar.Fly();第二块:function Car(name){ this.Name = name; this.Drive = function(){ console.log("My name is " + this.Name + " and I'm driving."); }}SuperCar.prototype = new Car();function SuperCar(name){ Car.call(this, name); this.Fly = function(){ console.log("My name is " + this.Name + " and I'm flying!"); }}var myCar = new Car("Car");myCar.Drive();var mySuperCar = new SuperCar("SuperCar");mySuperCar.Drive();mySuperCar.Fly();为什么笔者的增加Drive和Fly方法使用prototype,并没有宣布他们的this.Drive内部方法Car类和this.Fly在SuperCar类?为什么SuperCar.prototype.constructor需要重新开始SuperCar?设置constructor时prototype是否覆盖了属性?我评论了这一行并没有改变。为什么要Car.call(this, name);在SuperCar构造函数中调用?Car当我这样做时,属性和方法不会被“继承”var myCar = new Car("Car");
3 回答

狐的传说
TA贡献1804条经验 获得超3个赞
这两个块的不同之处在于,在第一个示例中Drive()
仅存在一次,而在第二个方法Drive()
中将存在每个实例(每次执行new Car()
此功能时drive()
将再次创建)。或者说不同的是第一个使用原型来存储函数而第二个使用构造函数。函数的查找是构造函数,然后是原型。因此,对于Drive()
它的查找,无论它是在构造函数中还是在原型中,都会找到它。使用原型更有效,因为通常每种类型只需要一次函数。
new
javascript中的调用会自动在原型中设置构造函数。如果要覆盖原型,则必须手动设置构造函数。
javascript中的继承没有什么比这更好的了super
。因此,如果你有一个子类,那么调用超级构造函数的唯一机会就是它的名字。
添加回答
举报
0/150
提交
取消