应届生都掌握的七种JS原型继承方法
栏目: JavaScript · 发布时间: 5年前
内容简介:注意:ES5 的继承实质是先创造子类的实例对象 this,然后再将父类的方法添加到 this 上面(Parent.call(this))。ES6 的继承机制实质是先创造父类的实例对象 this (所以必须先调用 super() 方法),然后再用子类的构造函数修改 this。
什么是js继承?
子类可以使用父类的所有功能 并且对这些功能进行拓展
原型链继承 (传统形式)
缺点: 过多的继承了没用的属性
Grand.prototype.lastName = 'chen' function Grand() {} var grand = new Grand(); Father.prototype = grand; function Father() { this.name = 'hehe'; } var father = new Father(); Son.prototype = father; function Son() {} var son = new Son(); 复制代码
借用构造函数(类式继承)
优点:
可以传参
缺点:
不能继承借用构造函数的原型
每次构造函数都要多走一个函数
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; } function Student(name, age, sex, grade) { Person.call(this, name, age, sex); this.grade = grade; } var student = new Student('hehe', 40, 'male', 18);复制代码
组合式继承(通俗来讲就是用原型链实现对原型属性和方法的继承 用借用构造函数继承来实现对实例属性的继承)
优点:
避免了原型链和构造函数的缺陷 融合他们的优点 成为JavaScript中最常用的继承模式
缺点:
实例和原型上存在两份相同的属性
Father.prototype.getfaName = function() { console.log(this.faName); } function Father(name) { this.faName = 'father'; } function Child(args) { this.chName = 'child'; Father.apply(this, []); } Child.prototype = new Father(); Child.prototype.constructor = Child; var child = new Child(); 复制代码
原型式继承
缺点
不能随便改动自己的原型
function create(o){ function F(){}; F.prototype = o; return new F(); } var Person = { name:'me', hobbies:['riding', 'swimming'] } var anotherPerson = create(Person); anotherPerson.name = 'her'; anotherPerson.hobbies.push('dancing'); console.log(anotherPerson.name, Person.hobbies); // her ["riding", "swimming", "dancing"]复制代码
寄生式继承
缺点
跟借用构造函数模式一样,每次创建对象都会创建一遍方法。
function createObj(o){ let clone = Object.create(o); clone.sayName = function(){ console.log('hi'); } return clone } let person = { name:"JoseyDong", hobbies:["sing","dance","rap"] } let anotherPerson = createObj(person); anotherPerson.sayName(); // => hi复制代码
圣杯模式(寄生组合继承)
// 第一种写法 function inherit(Target, Origin) { // 使用F空函数当子类和父类的媒介 是为了防止修改子类的原型对象影响到父类的原型对象 function F() {} F.prototype = Origin.prototype; Target.prototype = new F(); Target.prototype.constructor = Target; Target.prototype.uber = Origin.prototype; } // 第二种写法 var inherit = (function() { function F() {} return function(Target, Origin) { F.prototype = Origin.prototype; Target.prototype = new F(); Target.prototype.contructor = Target; Target.prototype.uber = Origin.prototype; } })复制代码
ES6继承的写法
class Plane { static alive() { return true; } constructor(name) { this.name = name || '普通飞机'; this.blood = 100; } fly() { console.log('fly'); } }; class AttackPlane extends Plane{ constructor(name) { super(name); this.logo = 'duyi'; } dan() { console.log('bububu'); } } var oAp = new AttackPlane('攻击机'); console.log(oAp);复制代码
注意:
- 子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工,如果不调用super方法,子类就得不到this对象。因此,只有调用super之后,才可以使用this关键字。
总结:
ES5 的继承实质是先创造子类的实例对象 this,然后再将父类的方法添加到 this 上面(Parent.call(this))。
ES6 的继承机制实质是先创造父类的实例对象 this (所以必须先调用 super() 方法),然后再用子类的构造函数修改 this。
你的点赞是我持续输出的动力 希望能帮助到大家 互相学习 有任何问题下面留言 一定回复
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 构造函数、原型、原型链、继承
- 前端基本功(七):javascript中的继承(原型、原型链、继承的实现方式)
- JavaScript原型链继承
- JavaScript 继承和原型链
- 彻底弄懂JS原型与继承
- 前端进击的巨人(七):走进面向对象,原型与原型链,继承方式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
移动交互设计精髓
班格 (Cameron Banga)、温霍尔德 (Josh Weinhold) / 傅小贞、张颖鋆 / 电子工业出版社 / 2015-4-1 / CNY 89.00
越来越多的人正涌入移动应用领域,而设计和体验将是移动应用成败的关键。作者通过上百款应用的设计实践,系统化地梳理了移动应用的设计方法论,在理解用户、跨平台和适配设计、移动组件应用、界面视觉感染力、简约设计等方面都进行了深入阐述。此外,作者还介绍了一些非常实用的移动设计工具,分享了设计师该如何与开发工程师协同工作,以及如何收集用户反馈、甄别版本迭代的更新需求等。 《移动交互设计精髓——设计完美的......一起来看看 《移动交互设计精髓》 这本书的介绍吧!