继承的几种方式

构造函数继承

在子类构造函数中借用call调用父类构造函数

function Person(name){
    this.name = name;
    this.country='china';
}
Person.prototype.play = function(){
    
}

function Child(name,age){
    this.age = age;
    Person.call(this,name)
}
var obj = new Child('小明',16);
复制代码

子类继承了父类的属性和方法,但是相当于每个实例都拷贝了一份父类的方法,占用内存大

原型继承

利用prototype将子构造函数的prototype指向Person达到继承的目的

function Person(name){
    this.name = name;
    this.country='china';
}
Person.prototype.play = function(){
    
}

function Child(age){
    this.age = age;
}

Child.prototype = new Person();

复制代码

实现了继承,但是无法给父构造函数传参

组合继承

基于以上两种继承方式的缺点,结合二者实现继承

function Person(name){
    this.name = name;
    this.country='china';
}
Person.prototype.play = function(){
    
}
function Child(name,age){
    Person.call(this,name);
    this.age = age;
}
Child.prototype = new Person();
复制代码

拷贝继承 把一个对象中的属性和方法复制到另一个

浅拷贝
 function shallowCopy(source, target = {}) {
        var key;
        for (key in source) {
            if (source.hasOwnProperty(key)) {        // 意思就是__proto__上面的属性,我不拷贝
                target[key] = source[key];
            }
        }
        return target;
    }

复制代码
深拷贝 
(对象里面嵌套对象才涉及深拷贝)
function deepCopy(source, target = {}) {
        var key;
        for (key in source) {
            if (source.hasOwnProperty(key)) {                         // 意思就是__proto__上面的属性,我不拷贝
                if (typeof(source[key]) === "object") {               // 如果这一项是object类型,就递归调用deepCopy
                    target[key] = Array.isArray(source[key]) ? [] : {};
                    deepCopy(source[key], target[key]);
                } else {                                            // 如果不是object类型,就直接赋值拷贝
                    target[key] = source[key];
                }
            }
复制代码

深拷贝黑科技

var targetObj = JSON.parse(JSON.stringify(copyObj))

缺点:
1、如果你的对象里有函数,函数无法被拷贝下来
2、无法拷贝copyObj对象原型链上的属性和方法
复制代码

转载于:https://juejin.im/post/5cff624ef265da1bbf6913e0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值