非构造函数实现继承

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;
}

判断一下是数组还是对象,然后递归调用浅拷贝。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容