JS的6种常见继承模式
数天前在知乎看到有人阿里面试被问到这个问题,我来总结一下。
1. 原型链继承:
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperProperty = function() {
return this.property;
};
function SubType() {}
SubType.prototype = new SuperType();
var o = new Subtype();
console.log(o.getSuperProperty); // true
原型链的问题:子类所有对象的原型都是同一父类对象,如果我们修改到了原型对象,那么所有子类对象内容都会改变。
2. 借用构造函数(也称作伪造对象继承和经典继承):
借用构造函数是在子类中调用父类的构造函数(所谓借用)。
function SuperType() {
this.property = ['hello', 'world'];
}
function SubType() {
SuperType.call(this);
}
构造函数的问题:父类在原型链中定义的函数不能被子类访问,也就是说所有的函数都必须写在构造函数内部,无法复用。
3. 组合继承(伪经典继承)*:
将原型链继承和借用构造函数继承组合到一起。
function SuperType(name) {
this.name = name;
this.color = ['red', 'green', 'blue'];
}
SuperType.prototype.sayName = function() {
console.log(this.name);
};
function SubType(name) {
SuperType.call(this, name); // 第二次调用
}
SubType.prototype = new SuperType(); // 第一次调用
SubType.prototype.constructor = Subtype; // 为了以后判断类型
不过组合继承也不是没有缺点,就是会至少调用两次构造函数,第一次调用在原型中添加了 SuperType 所拥有的属性,第二次调用的时候又覆盖了一次。这个开销其实是没有必要的。
4. 原型式继承:
Ojbect.create(prototypeObj);
这个方法会创建一个新的对象,新的对象的原型是 prototypeObj。
缺点和原型继承一样。
5. 寄生式继承:
核心思想在于在函数内部增强对象,返回一个新对象。
function createAnother(obj) {
var clone = Object.create(obj);
clone.sayHello = function() {
console.log('Hello');
};
return clone;
}
6. 寄生组合式继承:
完善组合式继承,不必为了指定子类型的原型而调用超类的构造函数,我们需要的无非就是超类的原型的一个副本(创造副本是为了子类上属性的修改不影响在原型链上的父类)而已,我们在一个函数里创建一个增强过的对象作为子类的原型(所谓寄生)。
function SuperType(name) {
this.name = name;
}
SuperType.prototype.sayName = function() {
console.log(this.name);
};
function SubType(name) {
Super.call(this, name);
}
function inheritPrototype(subType, superType) {
var prototype = Object(superType.prototype);
// 如果不像上面这么写,那么在子类添加方法会影响到父类,这不合理。
prototype.constructor = subType;
subType.prototype = prototype;
}
inheritPrototype(SubType, SuperType);
这个没什么缺点,主要是写着稍微麻烦一点。
JS的6种常见继承模式的更多相关文章
- JS中几种常见的数组算法(前端面试必看)
JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...
- JS中5种经典继承方式
继承 JS中继承的概念: 通过[某种方式]让一个对象可以访问到另一个对象中的属性和方法,我们把这种方式称之为继承 并不是所谓的xxx extends yyy 为什么要使用继承? 有些对象会有方法(动作 ...
- js+css:43种常见的浏览器兼容性问题大汇总
javascript 1.HTML对象获取问题 FireFox:document.getElementById(“idName”); ie:document.idname或者document.getE ...
- VMware虚拟机中涉及的3种常见网络模式
桥接模式.这种模式下,虚拟机和物理机连的是同一个网络,虚拟机和物理机是并列关系,地位是相当的.比如你家如果有用路由器,那么你的电脑和你的手机同时连接这个路由器提供的Wi-Fi,那么它们的关系就是这种模 ...
- JS中几种常见的高阶函数
高阶函数:英文叫Higher-order function.JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数 ...
- js中几种常见的方法的实例 shift,unshift,push,prop
1.shift()定义和用法 shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值. 语法:arrayObject.shift() 返回值:数组原来的第一个元素的值. 说明:如果 ...
- JavaScript 对象的创建和对6种继承模式的理解和遐想
JS中总共有六种继承模式,包括原型链.借用构造函数.组合继承.原型式继承寄生式继承和寄生组合式继承.为了便于理解记忆,我遐想了一个过程,对6中模式进行了简单的阐述. 很长的一个故事,姑且起个名字叫 ...
- JS继承模式粗探
之前提到了JS中比较简单的设计模式,在各种设计模式中被最常使用的工具之一就是原型链的继承.作为OOP的特质之一——继承,今天主要谈谈JS中比较简单的继承方法. 最基础的原型链继承在这里就不复述了,主要 ...
- JavaScript的7种继承模式
<JavaScript模式>一书中,对于JavaScript的几种继承模式讲解得很清楚,给我提供了很大帮助.总结一下,有如下7种模式. 继承模式1--设置原型(默认模式) 实现方式: // ...
随机推荐
- 错误代码: 1231 - Variable 'sql_mode' can't be set to the value of 'NULL'
错误代码: 1231 - Variable 'sql_mode' can't be set to the value of 'NULL' 错误代码: - Variable 'sql_mode' can ...
- c# 和 java <转载>http://www.cnblogs.com/zhucai/archive/2011/02/16/csharp-compare-java.html
从语法层面来讲,c# 和 java 是非常相似的. <转载> 这篇文章对C#与Java做一个语言级的对比,方便C#转Java或Java转C#的人有个大致了解.这里大致用C#3.0与Java ...
- Mybatis学习4——一对一关联查询方法1--创建实体
创建一个实体继承两个实体之一,另一个实体作为属性 实体1. order package pojo; import java.util.Date; public class Order { privat ...
- djangobb之forum.topics
看djangobb源代码时,看到view的show_forum(request, forum_id, full=True)时,对于topics = forum.topics.order_by('-st ...
- 玩转音频、视频的利器:FFmpeg
导语 当下直播平台发展十分迅猛,依靠游戏内直播平台的发展带动游戏活跃提升收入,那么对于我们开发来说如何玩转视频呢?下面就来介绍一个音频.视频处理利器——FFmpeg. FFmpeg 简介 FFmpeg ...
- 查看进程中的socket状态和数量
程序运行时查看,结果是这样子的 C:\Users\Administrator>netstat -ano|findstr TCP TIME_WAIT TCP TIME_WAIT TCP TIME_ ...
- 20165304《Java程序设计》第五周学习总结
教材学习内容总结 第七章 1.内部类 注意内部类和外嵌类的关系: 外嵌类的成员变量和方法在内部类有效 内部类的类体不可以声明static变量和方法.外嵌类的类体可以用内部类声明对象. 内部类仅供它的外 ...
- centos LVM详解
title: centos LVM详解 date: 2018-04-24 14:00:03 tags: [linux,centos,LVM] --- 知识了解 LVM关系图 fdisk命令详解 [ro ...
- Navicat Premium 连接Oracle 数据库(图文教程)
一.需要准备的软件 Navicat premium 32位 官方下载地址:http://www.navicat.com.cn/products/navicat-premium Instant Clie ...
- APP-9-文字识别-车牌识别
1.获取Access Token APP-9.1-百度应用-文字识别 2.代码部分 <!DOCTYPE html> <html> <head> <meta c ...