当前位置: 首页 > 面试题库 >

了解JavaScript中的原型继承

邢飞鸿
2023-03-14
问题内容

我是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?是constructor当覆盖的属性prototype设置?我注释了这一行,没有任何改变。

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

var myCar = new Car("Car");

问题答案:

这两个块的不同之处在于,在第一个示例中该实例Drive()仅存在一次,而在第二种方法中Drive()每个实例将存在一次(每次执行new Car()该功能时,drive()都会再次创建该函数)。或不同,第一个使用原型存储函数,第二个使用构造函数。对函数的查找是构造函数,然后是原型。因此,Drive()无论您是在构造函数中还是在原型中,都可以通过查找找到它。使用原型的效率更高,因为通常每个类型只需要一个函数。

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

javascript中的继承与没什么不同super。因此,如果您有子类,则调用超级构造函数的唯一机会就是其名称。



 类似资料:
  • 本文向大家介绍JavaScript的原型继承详解,包括了JavaScript的原型继承详解的使用技巧和注意事项,需要的朋友参考一下 JavaScript是一门面向对象的语言。在JavaScript中有一句很经典的话,万物皆对象。既然是面向对象的,那就有面向对象的三大特征:封装、继承、多态。这里讲的是JavaScript的继承,其他两个容后再讲。 JavaScript的继承和C++的继承不大一样,C

  • 本文向大家介绍JavaScript原型继承和原型链原理详解,包括了JavaScript原型继承和原型链原理详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了JavaScript原型继承和原型链原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在讨论原型继承之前,先回顾一下关于创建自定义类型的方式,这里推荐将构造函数和原型模式组

  • 本文向大家介绍JavaScript中的原型和继承详解(图文),包括了JavaScript中的原型和继承详解(图文)的使用技巧和注意事项,需要的朋友参考一下   请在此暂时忘记之前学到的面向对象的一切知识。这里只需要考虑赛车的情况。是的,就是赛车。   最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事。最快的车被称为 Le Mans 原型车。这些车虽然是由“奥迪”或“

  • 问题内容: 因此,我有两个来自javascript.info的示例: 范例1: 范例2: 从示例2开始:当代码到达时,它在中找不到任何属性,因此它爬升到原型并在那里进行了更改。这就是为什么两只仓鼠都相等的原因,换句话说,它们的肚子也一样。 据此我了解,当编写并添加一个不存在的新属性时,解释器将沿着原型链向上移动,直到找到该属性,然后再进行更改。 但是在示例1中,发生了其他事情: 我们运行,它发生了

  • 本文向大家介绍再谈javascript原型继承,包括了再谈javascript原型继承的使用技巧和注意事项,需要的朋友参考一下 真正意义上来说Javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提供了一种原型继承的方式,利用自身提供的原型属性来实现继承。 原型与原型链 说原型继承之前还是要先说说原型和原型链,毕竟这是实现原型继承的基础。 在Javascript中,每个函数都

  • 本文向大家介绍JavaScript使用原型和原型链实现对象继承的方法详解,包括了JavaScript使用原型和原型链实现对象继承的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript使用原型和原型链实现对象继承的方法。分享给大家供大家参考,具体如下: 实际上JavaScript并不是一门面向对象的语言,不过JavaScript基于原型链的继承方式、函数式语法,使得编