【发布时间】:2010-10-27 21:57:22
【问题描述】:
我是 JavaScript OOP 的新手。您能解释一下以下代码块之间的区别吗?我测试了两个块都可以工作。最佳做法是什么?为什么?
第一个区块:
function Car(name){
this.Name = name;
}
Car.prototype.Drive = function(){
console.log("My name is " + this.Name + " and I'm driving.");
}
SuperCar.prototype = new Car();
SuperCar.prototype.constructor = SuperCar;
function SuperCar(name){
Car.call(this, name);
}
SuperCar.prototype.Fly = function(){
console.log("My name is " + this.Name + " and I'm flying!");
}
var myCar = new Car("Car");
myCar.Drive();
var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();
第二块:
function Car(name){
this.Name = name;
this.Drive = function(){
console.log("My name is " + this.Name + " and I'm driving.");
}
}
SuperCar.prototype = new Car();
function SuperCar(name){
Car.call(this, name);
this.Fly = function(){
console.log("My name is " + this.Name + " and I'm flying!");
}
}
var myCar = new Car("Car");
myCar.Drive();
var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();
为什么作者在prototype中添加了Drive和Fly方法,并没有在Car类中声明为this.Drive方法,在SuperCar类中声明为this.Fly ?
为什么需要将SuperCar.prototype.constructor 设置回SuperCar?设置 prototype 时是否会覆盖 constructor 属性?我注释掉了这一行,没有任何改变。
为什么在SuperCar 构造函数中调用Car.call(this, name);?当我这样做时,Car 的属性和方法不会被“继承”
var myCar = new Car("Car");
【问题讨论】:
-
更现代的方法是使用 Object.create() 而不是 new:ncombo.wordpress.com/2013/07/11/…
-
请注意,此示例可能会造成混淆:本例中的“super”指的是飞行汽车,而 OOP 中的“super”通常指的是父原型/类。
-
我认为让 JavaScript 的原型继承难以理解的部分在于它将它与构造函数混合在一起。如果我们去掉构造函数和类的想法,我们只有对象。每个对象要么从无(null)继承,要么从另一个对象继承。这将更容易理解,而这正是 Object.create() 所做的。
标签: javascript oop inheritance constructor prototype-programming