为了账号安全,请及时绑定邮箱和手机立即绑定

了解JavaScript中的原型继承

了解JavaScript中的原型继承

陪伴而非守候 2019-07-31 14:35:09
了解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()它的查找,无论它是在构造函数中还是在原型中,都会找到它。使用原型更有效,因为通常每种类型只需要一次函数。

newjavascript中的调用会自动在原型中设置构造函数。如果要覆盖原型,则必须手动设置构造函数。

javascript中的继承没有什么比这更好的了super。因此,如果你有一个子类,那么调用超级构造函数的唯一机会就是它的名字。


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 275 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号