gpt4 book ai didi

javascript - 原型(prototype)对象继承

转载 作者:行者123 更新时间:2023-11-29 20:08:56 25 4
gpt4 key购买 nike

我是 Codeyear伙计,不幸的是原型(prototype)对象概念没有解释。我谷歌它并找到tutorial .经过学习,我的理解是我们使用原型(prototype)对象继承来节省内存并共享对象之间的公共(public)属性。 我说的对吗?如果是的话,你不认为下面的代码是不好的做法吗?由于汽车构造函数已经定义了价格、速度和 & getPrice,为什么我们需要再次定义相同的东西,因为我们使用了继承的概念。请解释 。下面是代码。

function Car( listedPrice ) {
var price = listedPrice;
this.speed = 0;

this.getPrice = function() {
return price;
};
}

Car.prototype.accelerate = function() {
this.speed += 10;
};

function ElectricCar( listedPrice ) {
var price = listedPrice;
this.speed = 0;

this.getPrice = function() {
return price;
};
}

ElectricCar.prototype = new Car(); // Please also explain why car constructor
// is not thowing error since we are not passing
// listedPrice parameter

myElectricCar = new ElectricCar(500);

console.log(myElectricCar instanceof Car);

最佳答案

构造函数和原型(prototype)是两个独立的概念。当您使用 ElectricCar.prototype = new Car(); 应用原型(prototype)继承时,它仅继承在对象及其原型(prototype)上定义的方法,而不是构造函数本身。

您实际上可以通过一些快速的 console.log() 调用看到它的工作方式:

console.log(ElectricCar);
console.log(ElectricCar.prototype);
console.log(ElectricCar.prototype.__proto__);

返回:

[Function: ElectricCar]
{ speed: 0, getPrice: [Function] }
{ accelerate: [Function] }

第一行是构造函数。

第二个是实际原型(prototype),由上面的 ElectricCar.prototype = new Car(); 设置。请记住,在 Car 的构造函数中,设置了 this.speedthis.getPrice,这解释了 ElectricCar.prototype 的值.speedElectricCar.prototype.getPrice

可能最不清楚的是最后一行,ElectricCar.prototype.__proto__。这是原型(prototype)的原型(prototype)。 Car 对象有一个 prototype 对象,其中定义了 accelerate。此原型(prototype)被复制到 ElectricCar 的内部 __proto__ 属性中。这叫做 prototype chaining .

因为构造函数不是原型(prototype)的一部分,而原型(prototype)是您要继承的全部内容,所以 Car 的构造函数已被复制并粘贴到 ElectricCar 中。正如您所指出的,肯定有更清洁的方法可以做到这一点。这是一个替代方案:

function ElectricCar( listedPrice ) {
Car.apply(this, arguments);
}

ElectricCar.prototype = new Car();

参见 apply了解更多详情。

至于您的最后一个问题(为什么 new Car() 不抛出错误),正如其他答案所说,这就是 JavaScript 的工作方式。如果您为函数提供的参数少于其参数,则任何未设置(可以这么说)的参数都将设置为 undefined。演示:

function returnMe(a) {
return a;
}

console.log(returnMe(5));
console.log(returnMe(2+2));
console.log(returnMe());
console.log(returnMe(undefined));

这将返回:

5
4
undefined
undefined

如您所见,undefined 实际上是一个可以传递的变量(如 returnMe(undefined))。有关更多信息,请参阅 undefined .

关于javascript - 原型(prototype)对象继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com