2

我是Codeyear研究员,不幸的是没有解释原型对象的概念。我在谷歌上搜索并找到了教程。经过学习,我的理解是我们使用原型对象继承来节省内存并在对象之间共享公共属性。我对吗 ?如果是,你不认为下面的代码是不好的做法。由于汽车构造函数已经定义了价格、速度和 & 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);
4

2 回答 2

3

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

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

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

这将返回:

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

第一行是构造函数。

第二个是实际原型,ElectricCar.prototype = new Car();如上所述。请记住,在 , 的构造函数中Car设置了this.speedand this.getPrice,它解释了ElectricCar.prototype.speed和的值ElectricCar.prototype.getPrice

可能最不明确的是最后一行,ElectricCar.prototype.__proto__. 这是原型的原型。Carobjects 有一个prototype在其中accelerate定义的对象。该原型被复制到ElectricCar其内部__proto__属性中的原型。这称为原型链接

因为构造函数不是原型的一部分,而原型是你继承的全部,所以构造函数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

于 2012-06-09T15:16:30.750 回答
0

getPriceprice是在其外部范围内创建对 var的闭包的方法,有效地创建price一个私有成员,为每个不同的实例分开,只有这个函数可以访问。

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

于 2012-06-09T15:01:31.947 回答