了解JavaScript中的原型继承

了解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();

为什么笔者的增加DriveFly方法使用prototype,并没有宣布他们的this.Drive内部方法Car类和this.FlySuperCar类?

为什么SuperCar.prototype.constructor需要重新开始SuperCar?设置constructorprototype是否覆盖了属性?我评论了这一行并没有改变。

为什么要Car.call(this, name);SuperCar构造函数中调用?Car当我这样做时,属性和方法不会被“继承”

var myCar = new Car("Car");


陪伴而非守候
浏览 277回答 3
3回答

狐的传说

这两个块的不同之处在于,在第一个示例中Drive()仅存在一次,而在第二个方法Drive()中将存在每个实例(每次执行new Car()此功能时drive()将再次创建)。或者说不同的是第一个使用原型来存储函数而第二个使用构造函数。函数的查找是构造函数,然后是原型。因此,对于Drive()它的查找,无论它是在构造函数中还是在原型中,都会找到它。使用原型更有效,因为通常每种类型只需要一次函数。newjavascript中的调用会自动在原型中设置构造函数。如果要覆盖原型,则必须手动设置构造函数。javascript中的继承没有什么比这更好的了super。因此,如果你有一个子类,那么调用超级构造函数的唯一机会就是它的名字。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript