ES5没有像ES6那样继承的方法,他也没有正了八经的类,所以都是自己封装的函数
首先,要有个父类
function Ball(user) { this.name=user; } Ball.prototype={ a:1, b:2, c:function () { this.a=10; } }; Ball.prototype.constructor=Ball;
然后要写一个继承的函数,最重要的就是这个函数,继承就是对父类原型的继承
function extend(subClass,supClass) { // 创建一个空类,空的构造函数 function A() {} // 设置这个空类的原型是父类的原型,这样保证这个空类和父类一样,但是没有父类构造函数内容 // 这样就解决直接继承时调用两次构造函数的情况 A.prototype=supClass.prototype; // 将这个与父类相似的类实例化后赋值给子类的原型,这样子类的原型就是这个空类的实例化对象 // 因此子类的原型里面就有了空类的原型下所有属性和方法 subClass.prototype=new A(); // 子类的原型指针指向子类的构造函数 subClass.prototype.constructor=subClass; // 因为可能在子类使用到父类原型 // 设置子类的属性superClass是父类的原型对象 subClass.superClass=supClass.prototype; // 如果父类原型的指针没有指向父类的构造函数,仍然指向的是对象 if(supClass.prototype.constructor===Object.prototype.constructor){ // 将父类的原型指针指向父类构造函数 supClass.prototype.constructor=supClass; } }
然后想要继承的子类就可以继承了,下面的代码对继承的子类有一些自己的修改
function Box(user) { Ball.call(this,user); } extend(Box,Ball); Box.prototype.d=function () { }; Box.prototype.e=5; Box.prototype.c=function () { Box.superClass.c.call(this); console.log(this.a); };
下面总结一下:
ES5的继承: 1、先写extend函数 2、新建父类和父类所有原型属性和方法 3、新建子类,并且在子类的构造函数中执行 父类构造函数.call(this,参数1,参数2..) 4、使用extend函数,填入子类和父类,完成继承 5、只能使用子类.prototype.属性/方法=...设置添加新的子类方法和属性 不能使用 子类.prototype={...}这种添加属性方法,这样会覆盖继承的方法 6、覆盖父类的方法,子类.prototype.父类方法=function(){} 7、super父类方法,就是希望在父类的该方法执行后在添加一些新的内容 子类.superClass.父类方法.call(this,参数...); 这句写在子类覆盖父类方法中 8、最后就可以使用new来实例化对象了
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217534.html原文链接:https://javaforall.net
