var Chinese={
nation:'china'
}
var Doctor={
career:'doctor'
}
这两个都是对象,不是构造函数,如何让Doctor继承Chinese的国家呢
(1)object()方法
思想就是:没有构造函数,我就制造构造函数。这是道格拉斯先生想出来的
function object(o){
function Fun(){}
Fun.prototype=o;
return new Fun();
}
那么就可以这样继承:
Doctor=object(Chinese);
console.log(Doctor.nation);
但是,此时的医生的职业已经被冲掉,因为Doctor被重新定义了,所以要再补充上
Doctor.career="doctor";
(2)浅拷贝
用拷贝的方法实现继承就是将父对象的属性都拷贝到子对象中。
function extendCopy(p,c){
for(var i in p){
c[i]=p[i];
}
return c;
}
然后再extendCopy(Chinese,Doctor);
就可以,得益于for in 循环,这个不用再重写Doctor的career属性。
但是这个叫做浅拷贝,也就是当复制数组或对象的时候,是存储的父对象的地址,两个对象在内存中指向同一个地址。
var Chinese={
nation:'china',
birthPlaces :['北京','上海','香港']
}
var Doctor={
career:'doctor'
}
function extendCopy(p,c){
for(var i in p){
c[i]=p[i];
}
return c;
}
extendCopy(Chinese,Doctor);
console.log(Doctor.career);
console.log(Doctor.nation)
Doctor.nation="America";
console.log(Doctor.nation);
console.log(Chinese.nation);
console.log("***********************");
console.log(Doctor.birthPlaces);
Doctor.birthPlaces.push('厦门');
console.log(Chinese.birthPlaces);
doctor
china
America
china //对于基本类型确实没有影响
***********************
["北京", "上海", "香港"]
["北京", "上海", "香港", "厦门"] //对象的浅拷贝使两者指向同一内存地址
这里补充一下JS中的值传递的知识:为什么基本类型无所谓浅还是深拷贝?以下是个人的解读,如有错误,欢迎指出:
参考:http://bosn.me/js/js-call-by-sharing/
基本类型是按值传递,函数的形参是实参的副本,修改形参的值不会影响实参。
var a=10;
var b=a;
b=6
console.log(a);//10
对象,是可变的,按共享传递,调用函数传参时,函数接受对象实参引用的副本。但和引用传递的不同是:对函数形参的赋值,不会影响实参的值。
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x);//1
但是因为共享相同的对象,所以修改形参的属性值,也会影响实参的属性值。
var obj = {x : 1};
function foo(o) {
o.x= 100;
}
foo(obj);
console.log(obj.x);//100
(3)深拷贝
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;
}
判断一下是数组还是对象,然后递归调用浅拷贝。