我是JavaScript OOP的新手。你能解释下面的代码块之间的区别吗?我测试过,并且两个块都可以工作最佳做法是什么?为什么?了解JavaScript中的原型继承
第一块:
function Car(name){
this.Name = name;
}
Car.prototype.Drive = function(){
document.write("My name is " + this.Name + " and I'm driving. <br />");
}
SuperCar.prototype = new Car();
SuperCar.prototype.constructor = SuperCar;
function SuperCar(name){
Car.call(this, name);
}
SuperCar.prototype.Fly = function(){
document.write("My name is " + this.Name + " and I'm flying! <br />");
}
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(){
document.write("My name is " + this.Name + " and I'm driving. <br />");
}
}
SuperCar.prototype = new Car();
function SuperCar(name){
Car.call(this, name);
this.Fly = function(){
document.write("My name is " + this.Name + " and I'm flying! <br />");
}
}
var myCar = new Car("Car");
myCar.Drive();
var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();
为什么使用prototype
笔者添加Drive
和Fly
方法,但不声明为this.Drive
方法内部Car
类和this.Fly
在SuperCar
类?
为什么SuperCar.prototype.constructor
需要设置回SuperCar
?当设置了prototype
时,构造函数属性是否被覆盖?我评论了这条线,没有任何改变。
为什么在SuperCar
构造函数中调用Car.call(this, name);
?会不会性能和Car
方法“继承”当我做
var myCar = new Car("Car");
更现代的方法是使用的Object.create( )而不是新的:http://ncombo.wordpress.com/2013/07/11/javascript-inheritance-done-right/ – Jon 2013-07-11 13:53:13
这个例子可能会让人困惑:在这种情况下,“超级”是指飞行的汽车,而OOP中的“超级”通常是指父级原型/类。 – mikemaccana 2014-04-28 09:53:48
我认为让JavaScript的原型继承难以理解的部分是它将它与构造函数混合在一起的地方。如果我们删除构造函数和类的概念,并且只有对象,会怎样?每个对象要么从空(null)或从另一个对象继承。这将会更容易理解,正是Object.create()所做的。 – 2014-07-08 18:00:09