[前端]JS-非构造函数的继承

1、object()方法

示例

var Chinese = {
  nation:'中国'
};
var Doctor ={
    career:'医生'
}
function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
  }
Doctor = object(Chinese);
Doctor.career = '医生';
console.log('Doctor:',Doctor); // Doctor: F {career: "医生"}
console.log('Doctor.nation:',Doctor.nation); // Doctor.nation: 中国

2、浅拷贝(这也能叫继承?[冷静一下])

var Chinese = {  
    nation: '中国'
};
var Doctor = {    
    career: '医生'
} 
function extendCopy(p) {    
    var c = {};    
    for (var i in p) {      
        c[i] = p[i];    
    }    
    c.uber = p;    
    return c;  
}
Doctor = extendCopy(Chinese);
Doctor.career = '医生';
console.log('Doctor:', Doctor); // Doctor: F {career: "医生"}
console.log('Doctor.nation:', Doctor.nation); // Doctor.nation: 中国
  • 缺点:因为是浅拷贝,相当于只是个指针的引用,子对象的属性修改后会影响父对象的属性
    如下
var Chinese = {  
    nation: '中国',
    birthPlaces: ['北京', '上海', '香港']
};
var Doctor = {    
    career: '医生'
} 
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 = '医生';

Doctor.birthPlaces.push('厦门');  

console.log('Doctor.birthPlaces:', Doctor.birthPlaces); // ["北京", "上海", "香港", "厦门"]
console.log('Chinese.birthPlaces:',Chinese.birthPlaces); // ["北京", "上海", "香港", "厦门"]

3、深拷贝

var Chinese = {  
    nation: '中国',
    birthPlaces: ['北京', '上海', '香港']
};
var Doctor = {    
    career: '医生'
}

// 递归复制
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); 
Doctor.career = '医生';

Doctor.birthPlaces.push('厦门');  

console.log('Doctor.birthPlaces:', Doctor.birthPlaces); // ["北京", "上海", "香港", "厦门"]
console.log('Chinese.birthPlaces:', Chinese.birthPlaces); // ["北京", "上海", "香港"]

仅作为学习笔记,有误请指正,玻璃心不接受批评
参考:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容