补基础之javascript面向对象-非构造函数的继承

来源:互联网 发布:西甲球员数据统计 编辑:程序博客网 时间:2024/05/16 09:03

一、什么是”非构造函数”的继承?

var Chinese = {  nation:'中国'};var Doctor ={  career:'医生'}

二、object()方法

//把子对象的prototype属性指向父对象,从而使得子对象与父对象连在一起function object(o) {  function F() {}  F.prototype = o;  return new F();}//先在父对象的基础上,生成子对象:var Doctor = object(Chinese);//再加上子对象本身的属性Doctor.career = '医生';//子对象已经继承了父对象的属性了。console.log(Doctor.nation); //中国

三、浅拷贝

  • 除了使用”prototype链”以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。
  • 但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。
function extendCopy(p) {  var c = {};  for (var i in p) {     c[i] = p[i];  }  c.uber = p;    return c;}var Doctor = extendCopy(Chinese);Doctor.career = '医生';alert(Doctor.nation); // 中国

四、深拷贝

  • 所谓”深拷贝”,就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用”浅拷贝”就行了。
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.birthPlaces = ['北京','上海','香港'];Doctor.birthPlaces.push('厦门');alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门alert(Chinese.birthPlaces); //北京, 上海, 香港
阅读全文
0 0
原创粉丝点击