Javascript面向对象编程(三):非构造函数的继承
什么是"非构造函数"的继承?
e.g
var Chinese={
nation:'中国'
};
var Doctor={
career:'医生'
};
那么,如何生成一个"中国医生"的对象?
该两个对象都是普通对象,不是构造函数,所有是不可以用构造函数方法实现"继承"的。
一、 object()方法
json格式的发明人Douglas Crockford提出object()函数,可以做到这一点:
function object(o){
function F(){}
F.prototype=0;
return new F();
}
其实就是把子对象的prorotype属性,指向父对象,从而使得子对象和父对象连在一起。
使用时:
var Doctor=new object(Chinese);
Doctor.career='医生';
alert(Doctor.nation); //中国
二、 浅拷贝:把父对象的属性,全部拷贝给子对象来实现继承。
function extendCopy(p){
var x={};
for(var i in p){
x[i]=p[i];
}
x.uber=p;
return x;
}
使用时:
var Doctor=extendCopy(Chinese);
Doctor.career='医生';
alert(Doctor.nation); //中国
Q:为什么叫做浅拷贝?
A:如果父对象的属性是数组或者另一个对象(类似于C#里面引用类型的概念),那么实际上,子对象获得的只是一个内存地址,该地址指向另一个真实的值。
下面举一个例子,就类似于C#里面的引用类型在其他地方被篡改的形式(思想上雷同):
Chinese.cities=["北京","上海","广州","深圳"];
var Doctor=extendCopy(Chinese);
Doctor.cities.push("南京");
由于Chinese的cities是数组(相当于C#中来说,就是引用类型的变量),在子对象中被新增了一个"南京"之后,其实Chinese父对象也会发生改变:
alert(Doctor.cities); // 北京,上海,广州,深圳,南京
alert(Chinese.cities); // 北京,上海,广州,深圳,南京
三、 深拷贝
深拷贝,其实就是递归浅拷贝。(不知道递归的同学去翻书and面壁)
function deepCopy(p,c){
var c=c||{};
for(var i in p){
if(typeof p[i]==='object'){
c[i]=(p[i].constructor===Array)?[]:{};
deepCopy(p[i],c[i]);
}else{
c[i]=p[i];
}
}
return c;
}
使用时:
var Doctor=deepCopy(Chinese);
Chinese.cities=["北京","上海","广州","深圳"];
Doctor.cities.push("南京");
alert(Doctor.cities); //北京、上海、广州、深圳、南京
alert(Chinese.cities); //北京、上海、广州、深圳
目前的jQuery库使用的就是这种继承方法。
浙公网安备 33010602011771号