前端面试笔记-- js重要概念: 继承

js继承

JS的继承也是其非常强大的特性之一,在面试中也是常被问及的知识点。s的继承可大致分为6种,笔者想通过一个具体的例子记述js的继承方式。
说到继承,那必然要有父类和字类,我们先写一个父类的构造函数,代码如下:

// 定义一个动物类
function Animal (name) {
  // 属性
  this.name = name || 'Animal';
  // 实例方法
  this.sleep = function(){
    console.log(this.name + '正在睡觉!');
  }
}
// 原型方法
Animal.prototype.eat = function(food) {
  console.log(this.name + '正在吃:' + food);
};

这里的父类构造函数是Animal, 定义了动物的name属性、一个实例方法sleep, 同时,构造函数的显式原型prototype上定义了一个原型方法eat。通过
js的继承方式,要实现的是字类继承父类的属性和方法,比如:子类为Cat, 通过继承,子类Cat构造的实例对象myCat除了有子类构造函数Cat的属性和方法,也要包含父类的属性和方法。

1、原型链继承

原型链继承的核心只有一句话: 将父类的实例作为子类的原型
在本文的例子中即为:

function Cat(){
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';

// 测试
var cat = new Cat();  
console.log(cat.name);   // 'cat' 来自Cat.prototype.name
console.log(cat.eat('fish'));   // cat正在吃: fish
console.log(cat.sleep());    // cat正在睡觉!
console.log(cat instanceof Animal); //true 
console.log(cat instanceof Cat); //true

学习js的继承方法,一定要注意区分对比不同的继承方式的优缺点。

原型链继承优点、特点:

  1. 简单,易于实现
  2. 父类新增原型方法和原型属性子类都可以访问到
  3. 子类构造的实例也是父类构造的实例(参见测试代码 cat instanceof Animal

原型链继承缺点:

  1. 子类可以重写父类原型上的方法: Cat.prototype._proto_.eat = null 。此时,父类上的原型方法eat已经被重置为null.
  2. 所有Cat实例化对象都一样,都共享有原型对象的属性及方法。修改一个,其他的实例对象也改变。

2、借助构造函数继承

话不多说,上代码:

function Cat(name, age){
  Animal.call(this, name);
  this.age = age;
}
// 测试
var cat = new Cat('Tom', 1);
console.log(cat.name);   // Tom
console.log(cat.sleep()); // Tom正在睡觉!
console.log(cat.eat('fish'));  // Uncaught TypeError: cat.eat is not a function
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true

优点:

  1. 可以实现多继承(call多个父类对象)
  2. 创建子类实例时,可以向父类传递参数
  3. 解决了原型链继承中,子类实例共享父类引用属性的问题

缺点:

  1. 只能继承父类构造函数的方法和属性,不能继承父类显式原型上的属性和方法
  2. 每次实例化子类,都要调用一次父类的构造函数,对于父类构造函数中的方法,继承时,每次都要创建一次,无法实现函数的复用。

3、组合继承

也就是结合原型链继承和构造函数继承的优点。话不多说,还是上代码:

function Cat(name, age){
  Animal.call(this, name);
  this.age = age;
}
Cat.prototype = new Animal();

// 测试
var cat = new Cat('Tom', 1);
console.log(cat.name);   // Tom
console.log(cat.sleep()); // Tom正在睡觉!
console.log(cat.eat('fish'));  // Tom正在吃:fish
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true

优点:

结合了原型链继承和构造函数继承的各自优势:

  1. 通过原型链继承父类的原型方法;
  2. 借助构造函数,继承父类属性。
    这也是比较常用的js继承方法,可以满足大多数的需求,一定要牢记哦~

缺点:

无论什么情况下,都会调用两次父级构造函数:一次是在创建子级原型的时候,另一次是在子级构造函数内部

(未完待续~)

续:回头再看这个问题,有更深一点的理解,因此又默了一遍,贴出来对比一下前后的理解:

  1. 原型链继承: 父类的实例作为子类的原型
Child.prototype = new Father()
回忆原型链: 
function Person() {this.name = 'tom'} 
Person.prototype.constructor === Person   // 构造函数的显式原型的constructor指向构造函数本身
person = new Person()   // 实例
person.__proto__ === Person.prototype
因此缺点:
    Child.prototype.__proto__ === father.__proto__ === Father.protoType
    // 因此,麻烦了
    Child.prototype.__proto__ = null
    Father.protoType === null // true

也就是,子类可以重写父类原型上的方法,
牵一发动全身:
所谓继承,是通过prototype实现的,所有子类实例化对象共享有原型对象的属性及方法。修改一个,其他的实例对象也改变。

  1. 构造函数继承
    核心是 子类构造函数调用父类构造函数,通过call
function Child() {
    Father.call(this)
}

优点和缺点都很明显。因为这种操作相当于,每次去new一个子类的实例,都调用一次父类构造函数,所以:
优点: 子类的属性和方法是单独的,不会互相影响,
缺点:因为属性和方法都是单独的,无法实现复用,每个子类都有父类实例函数的副本,影响性能
且无法继承父类的原型属性和方法

  1. 组合继承–结合原型链和构造函数
    核心:
function Child() {
    Father.call(this)
}

Child.prototype = new Father();
// 如果要给子类构造函数的原型对象添加原型属性,放在上一句代码之后
Child.prototype.eat = function() {
    console.log('正在吃饭')
}

优点当然就是前两者的优点,缺点:调用了两次父类构造函数

寄生继承,来源于原型式继承
原型式继承:
ES5的Object.create

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01大前端开发和全栈开发的定义.avi 02前端开发基础视频-视频内容介绍.avi 03前端开发基础视频-操作系统常用设置.avi 04前端开发基础视频-操作系统通用快捷键操作(1)win快捷键使用.avi 05前端开发基础视频-操作系统通用快捷键操作(2)编辑快捷键.avi 06前端开发基础视频-sublime3安装和插件(1).avi 06前端开发基础视频-sublime3安装和插件(2).avi 07前端开发基础视频-sublime3常用快捷键(基础).avi 08前端开发基础视频-atome安装和使用简介.avi 09前端开发基础视频-webstorm的使用和三个开发工具的选择.avi 06前端开发基础视频-sublime3安装和包管理器安装.avi 07前端开发基础视频-sublime3包管理器安装.avi 11前端开发基础视频-什么是浏览器什么是服务器端.avi 12前端开发基础视频-浏览器与服务器端补充.avi 13前端开发基础视频-HTML协议发展的历程(可以略过,非重点,了解即可).avi 14前端开发基础视频-常见前端的名词解释.avi 15前端开发基础视频-网页的组成html+css+JavaScript.avi 16前端开发基础视频-HTML的页面结构.avi 17前端开发基础视频-HTML的语法.avi 18前端开发基础视频-HTML的文档声明标签.avi 19前端开发基础视频-HTML的文档标签.avi 20前端开发基础视频-head标签和页面编码title标签使用.avi 21前端开发基础视频-页面编码补充1.avi 21前端开发基础视频-页面编码补充2.avi 21端开发基础视频-页面编码补充.avi 22前端开发基础视频-link标签的常见用法.avi 23前端开发基础视频-URL协议.avi 23前端开发基础视频-h1h6标题标签与seo.avi 24前端开发基础视频-段落p标签.avi 25前端开发基础视频-hr标签br标签空格换行合并.avi 26前端开发基础视频-span标签和em标签语义化.avi 27前端开发基础视频-em标签和strong标签区别sub标签-sup标签-del标签的使用.avi 28前端开发基础视频-关于超级链接的使用.avi 24前端开发基础视频-URL编码urlencode.avi 25前端开发基础视频-相对路径和绝对路径.avi 26前端开发基础视频-图片标签img的使用和title的seo优化.avi 27前端开发基础视频-网站图片的类型及如何选择.avi 28前端开发基础视频-有序列表和无序列表.avi 29前端开发基础视频-有序列表和无序列表的补充.avi 30前端开发基础视频-自定义列表.avi 31前端开发基础视频-表格标签的使用.avi 32前端开发基础视频-单元格的合并.avi 33前端开发基础视频-div和span标签的应用.avi 34前端开发基础视频-表单标签form-input-select-textarea.avi 35前端开发基础视频-QQ注册案例.avi 36前端开发基础视频-表单分组标签.avi 37前端开发基础视频-表单标签总结.avi 38前端开发基础视频-内联框架标签iframe使用.avi 39前端开发基础视频-其他标签补充.avi 40前端开发基础视频-字符实体HTML特殊符号处理.avi 41前端开发基础视频-HTML语义化.avi 42前端开发基础视频-HTML标签的显示模式.avi 43前端开发基础视频-HTML部分总结.avi 44前端开发基础视频-CSS定义与HTML结构之间的关系.avi 45前端开发基础视频-行内样式和浏览器默认样式.avi 46前端开发基础视频-引用外部CSS文件和嵌入CSS样式.avi 47前端开发基础视频-import导入CSS样式详解.avi 48前端开发基础视频-CSS语法及简单CSS属性.avi 49前端开发基础视频-CSS语法案例.avi 50前端开发基础视频-CSS注释.avi 51前端开发基础视频-标签选择器和通配符选择器.avi 52前端开发基础视频-ID选择器.avi 53前端开发基础视频-HTML标签的ID命名规范.avi 54前端开发基础视频-类选择器.avi 55前端开发基础视频-多个类属性、id和class选择器的区别.avi 56前端开发基础视频-类选择器id选择器综合案例.avi 57前端开发基础视频-复合选择器之标签指定式选择器.avi 58前端开发基础视频-复合选择器之后代选择器.avi 59前端开发基础视频-复合选择器之并集选择器.avi 60前端开发基础视频-复合选择器之子元素选择器.avi 61前端开发基础视频-属性选择器.avi 62前端开发基础视频-CSS伪类的使用案例.avi 63前端开发基础视频-CSS伪元素.avi 64前端开发基础视频-CSS层叠性.avi 65前端开发基础视频-CSS继承性.avi 66前端开发基础视频-CSS特殊性即CSS优先级(上).avi 67前端开发基础视频-CSS特殊性即CSS优先级(中).avi 68前端开发基础视频-CSS特殊性即CSS优先级(下).avi 69前端开发基础视频-CSS设置标签模式display属性介绍.avi 70前端开发基础视频-CSS设置标签模式display设置none隐藏标签.avi 71前端开发基础视频-CSS设置标签模式display行内块元素及块级行内的区别总结.avi 72前端开发基础视频-CSS颜色表示方法.avi 73前端开发基础视频-CSS长度单位表示.avi 74前端开发基础视频-关于像素的补充-CSS设置字体大小.avi 75前端开发基础视频-font-family设置字体类型.avi 76前端开发基础视频-font-family设置字体系列.avi 77前端开发基础视频-font-weight设置字体的粗细.avi 78前端开发基础视频-font-style设置字体的样式.avi 79前端开发基础视频-font字体所有属性合写.avi 80前端开发基础视频-设置字符的间距和文字的间距.avi 81前端开发基础视频-按钮综合案例.avi 82前端开发基础视频-彻底搞懂行高.avi 83前端开发基础视频-行高的练习.avi 84前端开发基础视频-文本的装饰线的控制.avi 85前端开发基础视频-text-indent设置首行缩进.avi 86前端开发基础视频-white-space设置文本不换行控制.avi 87前端开发基础视频-设置单词自动换行的处理.avi 88前端开发基础视频-体育新闻综合案例.avi 89前端开发基础视频-CSS盒模型的综述.avi 90前端开发基础视频-CSS盒模的总结.avi 91前端开发基础视频-CSS盒模的边框border设置详解.avi 92前端开发基础视频-CSS边框的妙用案例.avi 93前端开发基础视频-CSS内边距Padding的使用.avi 94前端开发基础视频-CSS内边距补充.avi 95前端开发基础视频-CSS外边距margin的详解.avi

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值