2012-06-09 124 views
2

我是Codeyear老乡,不幸原型对象的概念没有解释。我google了一下,发现tutorial。在学习之后,我的理解是,我们使用原型对象继承来节省内存并在对象之间共享公共属性。 对不对?如果是的话,你不觉得下面的代码是坏习惯。由于汽车制造商已经定义了价格,速度和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); 
+0

这可能会帮助你:http://stackoverflow.com/questions/10836064/what-does-anobject-prototype-constructor-do – Sarfraz

回答

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.speedthis.getPrice,这解释了值为ElectricCar.prototype.speedElectricCar.prototype.getPrice

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

因为构造函数是不是该原型的一部分,原型是你继承所有,用于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

0

getPrice是这样的方式在其外部范围创造了price VAR封闭,有效地使price的私有成员,对于每一个不同的实例独立,只有这个功能都不能访问。

构造函数不会抛出错误,因为在JavaScript中为函数提供参数从不强制。您可以提供尽可能多的,只要有命名参数,首先从您提供的列表中分配给这些名称。