我是码年研究员,不幸的是原型对象概念没有得到解释,我在谷歌上找到了教程。在学习之后,我的理解是,我们使用原型对象继承来节省内存,并在对象之间共享公共属性。我是对的吗?如果是的话,你不认为下面的代码是错误的做法吗?既然汽车构造函数已经定义了价格、速度和& 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);发布于 2012-06-09 15:16:30
构造函数和原型是两个独立的概念。当您使用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.speed和this.getPrice,这说明了ElectricCar.prototype.speed和ElectricCar.prototype.getPrice的值。
也许最不清楚的是最后一行,ElectricCar.prototype.__proto__。这是原型的原型。Car对象有一个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-09 15:01:31
getPrice是在其外部作用域中在price var上创建闭包的方式,有效地使price成为一个私有成员,对于每个不同的实例都是分开的,只有这个函数才能访问它。
构造函数不会抛出错误,因为向JavaScript中的函数提供参数从来都不是强制性的。您可以提供您想要的多少,只要有命名的参数,首先从您提供的列表中分配给该名称。
https://stackoverflow.com/questions/10961941
复制相似问题