我正在学习JS中的课程,如果您看下面的代码
class Car{
drive(speed) {
console.log('Drive at '+ speed)
}
}
const car1 = new Car();
我在Car类中定义了函数drive()
,很显然drive()
是自动附加到Car.prototype的,这确保了drive()
的一个副本,而问题是我们是否创建然后将drive()复制到car1
,如果不是,如何将drive()
的一个副本复制并传递参数获得不同的结果。
答案 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"