JS的面向对象写法
function worker(name, age){
this.name = name;
this.age = age;
this.isWorking = false;
}
worker.prototype.startWork = function(){
if(this.isWorking) return;
this.isWorking = true;
};
//在此处尝试定义一个endWork方法
var tom = new worker("tom", 40);
var jim = new worker("jim",20);
var html = "tom和jim两个实例的startWork方法是否共用内存 : " + (tom.startWork == jim.startWork).toString();
document.write(html);
对象的继承
jQuery提供了对原始对象的简单继承方法:$.extend,它会使用后面的对象与前面的对象的成员加起来,成生新的对象。
var obj1 = {
name : "obj1",
age : 30
};
var obj2 = $.extend(obj1,{
age : 20,
sayHello : function(){
document.write("hello!<br/>");
}
});
document.write(obj2.age + "<br/>");
obj2.sayHello();
上面obj1是通过{}写法来构造父类对象的,但是如果obj1是通过function这种方式来构造对象是无法使用$.extend去做继承的。
调用父类的构造函数
function leader(name,age){
worker.apply(this,arguments);
}
- apply这是JavaScript内置的一个方法,只要是声明成为function的对象,都会拥有该成员.
- arguments这个关键字只能在function内部使用,表示的是参数列表,在上述示例中arguments中包含的就是name和age。
- 通过worker.apply(this,arguments),相当于使用当前实例和当前参数列表执行了一次worker方法,也就意味着将当前实例和name,age进行了一次worker的构造。
直接继承成员
光调用了父类型的构造函数,但是其原型中的成员依然没有建立在当前类型中。
我们可以通过直接引用的方法得到父类型中的所有成员:
leader.prototype = worker.prototype;
var Green = new leader("Green",50);
Green.startWork();
通过直接引用的方法,leader得到了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