面向对象之继承(拷贝继承)
js中的继承,个人觉得一直是js的软肋,当然自从es6中新增了extend,得到了很大的改观,我们今天不对extend做介绍,主要介绍一下js中最早实现继承的一些方法
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.showName = function(){ console.log(this.name); } var p = new Person('张三',20); p.showName(); //'张三';
上面是个简单的面向对象程序,我们来再写一个ExtendPerson对象来继承Person对象;
function ExtendPerson(name,age,job){ Person.call(this,name,age); //调用父类的构造函数,默认情况下this指向window,所以要改变this指向,使其指向当前的对象 this.job = job; }
以上代码实现了属性的继承,那么怎么继承父类的方法呢
ExtendPerson.prototype = Person.prototype;
我们把父类的原型,赋值给子类的原型,虽然这样确实可以将父类的方法继承过来,但是因为赋值就出现了对象的引用,也就意味着给子类添加方法父类也就拥有了添加的方法,这显然不是我们想要的结果,那么怎么办呢,可以这样
function extend(obj1,obj2){ for(var attr in obj1){ obj2[attr] = obj1[attr]; } }
我们封装一个方法,并调用
extend(Person.prototype,ExtendPerson.prototype);
这样我们就实现了方法的继承,这种方法我们称之为拷贝继承!jQuery中采用的就是这种方法!