js继承:
一.父类构造函数继承:
function leader(name,age){
worker.apply(this,arguments);
}
1.apply这是JavaScript内置的一个方法,只要是声明成为function的对象,都会拥有该成员。对于后台技术较高的同学,你可以将apply理解为反射调用。对于并不了解反射的同学,可以这样理解:我们正常情况下调用一个方法是对象.方法名(参数列表),使用apply的话,我们就是方法名.apply(对象,参数列表),顺序不一样了
2.arguments这个关键字只能在function内部使用,表示的是参数列表,在上述示例中arguments中包含的就是name和age
二.原型的继承子类的修改不应该对父类造成影响。那我们不能让父类的原型直接赋给子类的原型,而用父类型的一个副本就行了。
通过这行代码,我们相当于通过创建了一个worker实例,并将这个实例中的各个成员赋值给leader的原型,这样一来,对子类的修改仅仅影响worker的实例,而不会影响worker的原型。
- leader.prototype = new worker();
- leader.prototype.startWork = function(){
- //some code here;
- };
- var w = new worker("",0);
- var l = new leader("",0);
- document.write(w.startWork == l.startWork); //false
function worker(name, age){
this.name = name;
this.age = age;
this.isWorking = false;
}
worker.prototype.startWork = function(){
if(this.isWorking) return;
this.isWorking = true;
};
function leader(name, age){
worker.apply(this, arguments);
this.workers = [];
}
leader.prototype = new worker(); //重点
leader.prototype.startWork = function(){
//重写工人的开始工作方法
if(this.isWorking) return;
var workerLength = this.workers.length;
for(var i = 0; i < workerLength; i++){
this.workers[i].startWork();
}
};
var tom = new leader("tom",40);
var jim = new worker("jim",20);
tom.workers.push(jim);
tom.startWork();
var html = "tom和jim两个实例的startWork方法是否共用内存 : " + (tom.startWork == jim.startWork).toString();
document.write(html);
来源地址:http://www.hubwiz.com/