首先说到继承:我们为什么要实现继承?我个人认为1,减少代码,相同功能写一遍就好了,然后让子类继承就好了。2,方便维护,如果我要修改某个功能的实现方法,只在最高的那个父类修改了,其他类会随之修改。我们可以发现js的中的系统的一些类就是这样做的。那么我们来一块看看寄生组合继承的实现原理,
类A作为父类,类B作为子类。--我们利用call使B继承A的私有方法,让B的原型等于A的原型,然后让B的原型的构造函数为B
//给Object类的原型上增加一个兼容非标准浏览器的exCreate方法,实现和create方法一样的功能 Object.prototype.exCreate = function (obj) { function fn() { }; fn.prototype = obj; return new fn(); } //类A function A() { this.x = 100; } A.prototype.getX = function () { console.log(this.x); } //类B function B() { //实现继承类A的私有属性 A.call(this); } //实现类B的原型为类A的原型并且利用constructor使原型的构造函数为B B.prototype = Object.exCreate(A.prototype); B.prototype.constructor = B; var c = new B(); console.log(c);
这个时候我们会发现,B已经继承A的一些属性和方法并且B的第一层 __proto__上可以增加新的原型方法,切不会影响第二层__protp__即A上的方法getX() 当我们修改A的原型上的getX时,B上也同样修改了。
function Person(name) { this.name = name; }
Person.prototype.sayName = function() { console.log("My name is " + this.name + "."); };
function Student(name, grade) { Person.call(this, name); this.grade = grade; }
Student.prototype = Object.create(Person.prototype); Student.prototype.constructor = Student;
Student.prototype.sayMyGrade = function() { console.log("My grade is " + this.grade + "."); };
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。