首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原型对象继承

原型对象继承
EN

Stack Overflow用户
提问于 2012-06-09 14:48:03
回答 2查看 132关注 0票数 2

我是码年研究员,不幸的是原型对象概念没有得到解释,我在谷歌上找到了教程。在学习之后,我的理解是,我们使用原型对象继承来节省内存,并在对象之间共享公共属性。我是对的吗?如果是的话,你不认为下面的代码是错误的做法吗?既然汽车构造函数已经定义了价格、速度和& getPrice,为什么我们需要再次定义相同的东西,因为我们使用的是继承的概念。请解释一下。下面是密码。

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-09 15:16:30

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

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

代码语言:javascript
复制
console.log(ElectricCar);
console.log(ElectricCar.prototype);
console.log(ElectricCar.prototype.__proto__);

这将返回:

代码语言:javascript
复制
[Function: ElectricCar]
{ speed: 0, getPrice: [Function] }
{ accelerate: [Function] }

第一行是构造函数。

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

也许最不清楚的是最后一行,ElectricCar.prototype.__proto__。这是原型的原型。Car对象有一个prototype对象,其中定义了accelerate。该原型被复制到ElectricCar的内部__proto__属性的原型中。这叫做原型链

因为构造函数不是原型的一部分,并且原型是您要继承的全部,所以Car的构造函数已经被复制并粘贴到ElectricCar中。正如您所指出的,确实有更干净的方法可以做到这一点。以下是另一种选择:

代码语言:javascript
复制
function ElectricCar( listedPrice ) {
    Car.apply(this, arguments);
}

ElectricCar.prototype = new Car();

有关更多详细信息,请参阅apply

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

代码语言:javascript
复制
function returnMe(a) {
    return a;
}

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

这将返回:

代码语言:javascript
复制
5
4
undefined
undefined

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

票数 3
EN

Stack Overflow用户

发布于 2012-06-09 15:01:31

getPrice是在其外部作用域中在price var上创建闭包的方式,有效地使price成为一个私有成员,对于每个不同的实例都是分开的,只有这个函数才能访问它。

构造函数不会抛出错误,因为向JavaScript中的函数提供参数从来都不是强制性的。您可以提供您想要的多少,只要有命名的参数,首先从您提供的列表中分配给该名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10961941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档