A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sangwentao 中级黑马   /  2016-6-5 19:11  /  1867 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

《高程》上对js继承介绍的很详细。下面说下个人的理解。

继承需要满足如下条件:
1.父类的有些属性需要每个子类实例有一个副本。(this.att)
2.父类中的有些属性(方法)需要子类实例(和父类实例)共享。(prototype)
3.子类在自己的prototype中添加属性不会被父类感知到。


组合继承(借用构造函数+原型)有问题:子类在原型中继承了父类的this.att定义的属性。与借用构造函数继承有冗余。若为此欲减少冗余可以使子类prototype直接等于父类prototype。但是这样又会使子类向prototype中添加属性时被父类感知到。


可以有以下两种方案:
1.克隆一个父类prototype对象赋给子类的prototype。(这样的话父类添加原型属性或方法子类感知不到)
2.新建一个对象赋给子类的prototype,并使这个对象的prototype指向父类的prototype。


代码:
父类:
function father(){
    this.fatherattr="fatherattr";
}
father.prototype={
    fathercommon:'fathercommon',
    fatherfunc:function(){
        console.info('execute fatherfunc');
    }
}

子类:
function child(){
     this.childattr="childattr";
     father.call(this);
}

function createnewobj(prototype){
     function newobj(){}
     newobj.prototype=prototype;
     return new newobj();
}
child.prototype=createnewobj(father.prototype);
child.prototype.childprivate="childprivate";





子类也可以写成一个函数:
function createchild(){
    function child(){                //借用构造函数继承
        this.childattr="childattr";
        father.call(this);
    }
    function createnewobj(prototype){   
        function newobj(){}
        newobj.prototype=prototype;
        return new newobj();
    }
    child.prototype=createnewobj(father.prototype);//原型继承
    child.prototype.childprivate="childprivate";
    return new child();
}

var child1=createchild();
console.info(child1.fathercommon);

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马