与JS类中的函数混淆

时间:2019-07-20 05:24:34

标签: javascript

我正在学习JS中的课程,如果您看下面的代码

class Car{
  drive(speed) {
     console.log('Drive at '+ speed)
   }
}

const car1 = new Car();

我在Car类中定义了函数drive(),很显然drive()是自动附加到Car.prototype的,这确保了drive()的一个副本,而问题是我们是否创建然后将drive()复制到car1,如果不是,如何将drive()的一个副本复制并传递参数获得不同的结果。

3 个答案:

答案 0 :(得分:1)

是的,它在Car class的实例上可用,您可以在drive类的任何实例上调用Car的函数时传递值

class Car {
  drive(speed) {
    console.log('Drive at ' + speed)
  }
}

const car1 = new Car();
car1.drive('50 kmph')

答案 1 :(得分:1)

这是在我们的课程中添加太多“ ”而又不知道它在发生什么的一种混淆。

您的班级是使用 ES6

定义的
class Car {
  drive(speed) {
    console.log('Drive at ' + speed)
  }
}

接下来的工作是使用新建

类使用您的类构造对象

第一个问题是 new 关键字的作用是什么?

  • 创建了一个新对象,该对象继承自Car原型
  • 附加到此新创建的对象

因此,通过执行const car1 = new Car();,您将获得一个新对象,其中的原型将获得drive函数。

ES5 中,您的类是使用构造函数编写的。

function Car() {}

Car.prototype.drive = function (speed) { console.log(speed); }

现在,您可以这样做:console.log(Car.prototype.constructor);,您会看到所示的构造函数是Car。

如果要在 ES6 中创建子类,请使用 extends 关键字,但是在 ES5 中,实际发生的情况是:

Function SuperFastCar() {}

SuperFastCar.prototype = Object.create(Car.prototype);
SuperFastCar.prototype.turbo = function (maxSpeed) { console.log(maxSpeed); }
SuperFastCar.prototype.constructor = SuperFastCar;

Object.create使用提供的对象作为原型创建一个新对象。另外,我们需要覆盖constructor,否则Car会出现SuperFastCar构造函数。

答案 2 :(得分:0)

您在prototype中创建的所有内容都将在该类的所有实例之间共享。请记住,在prototype内定义的方法中,通常是在定义类的行为(应该在所有实例之间共享)。

现在,当您定义Car类的第二个实例时,第一个实例和第二个实例都共享drive方法。但这并不意味着他们不能使用不同的值调用该方法:

class Car {
    drive(speed) {
        console.log('Drive at '+ speed)
    }
}

const car1 = new Car();
car1.drive('10mph'); // ---> Will log "Drive at 10mph"

const car2 = new Car();
car2.drive('15mph'); // ---> Will log "Drive at 15mph"