深入理解javascript中的继承机制 之 12种继承模式总结原型链法仅从原型继承临时构造器原型属性拷贝所有属性拷贝(浅拷贝)深拷贝原型继承法扩展与增强模式多重继承法寄生式继承借用构造函数:构造器于

之前我们介绍了多种javascript中的继承方式,最后我们开始总结概括这些继承方式,先将javascript中的继承分类,根据不同的条件,可以分成不同的类别。 最常用的我们可以分为这两类:

  • 基于构造器的继承模式
  • 基于对象的继承模式

或者我们也可以如下分类:

  • 是否使用原型
  • 是否使用了属性拷贝
  • 即使用了原型,也使用了属性拷贝

下面我们就来总结回顾一下javascript中的继承模式

原型链法

示例:

Child.prototype = new Parent();

分类: 使用了原型 基于构造器的继承模式

** 注意 **:

  • 默认的继承机制
  • 我们可以将需要重用的属性和方法移到原型中,不需要重用的则作为自身的属性

仅从原型继承

实例:

Child.prototype = Parent.prototype;

分类: 基于构造器模式 复制原型对象,没有原型链的关系,因为都共用一个原型对象 ** 注意 **:

  • 效率更高,没有多余的实例被new出来
  • 原型属性查找更快,因为不存在原型链关系
  • 由于都是基于同一个原型,所以对子对象的修改,会影响到父对象

临时构造器

实例

function extend(Child,Parent) {
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype;
}

分类: 基于构造器模式 使用了原型链 ** 注意 **:

  • 是前面几种方法的改进,只继承原型对象的属性和方法,自身属性和方法是不继承的
  • 通过uber可以方便的访问到父对象

原型属性拷贝

实例:

function extend2(Child,Parent) {
var p = Parent.prototype;
var c = Child.prototype;
for (var i in p) {
c[i] = p[i];
}
c.uber = p;
}

分类: 基于构造器模式 基于属性拷贝的模式 使用了原型链

** 注意 **:

  • 父原型的所有属性拷贝到子原型上
  • 不用new出新的对象
  • 更短的原型链

所有属性拷贝(浅拷贝)

实例:

function extendCopy(p) {
var c = {};
for (var i in p) {
c[i] = p[i];
}
c.uber = p;
return c;
}

分类: 基于对象的模式 属性拷贝

** 注意 **:

  • 简单
  • 不用使用原型

深拷贝

实例:

function deepCopy(p, c) {
c = c || {};
for (var i in p) {
if (p.hasOwnProperty(i)) {
if (typeof p[i] === 'object') {
c[i] = Array.isArray(p[i]) ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
}
return c;
}

分类: 基于对象的模式 属性拷贝

** 注意 **:

  • 简单
  • 不用使用原型
  • 对对象和数组也进行了复制

原型继承法

实例:

function object(o)
{
function F() {}
F.prototype = o;
return new F();
}

分类: 基于对象的模式 使用原型链 ** 注意 **:

  • 直接在对象之间构建继承关系

扩展与增强模式

实例:

function objectPlus(o, stuff) {
var n;
function F() {}
F.prototype = o;
n = new F();
n.uber = o;
for (var i in stuff) {
n[i] = stuff[i];
}
return n;
}

分类: 基于对象的工作模式 使用原型链 属性拷贝模式 ** 注意 **

  • 此方法实际上是原型继承法与属性拷贝法的混合应用
  • 同时实现继承和扩展

多重继承法

function multi() {
var n = {}, stuff,j = 0,
len = arguments.length;
for (j = 0; j<len; j++) {
stuff = arguments[j];
for (var i in stuff) {
n[i] = stuff[i];
}
}
return n;
}

分类: 基于对象的工作模式 属性拷贝模式 ** 注意 **

  • 一种混合插入式的继承实现
  • 依照父对象出现的次序,执行属性全拷贝方法

寄生式继承

实例:

function parasite(victim) {
var that = object(victim);
that.more = 1;
return that;
}

分类: 基于对象的工作模式 使用原型链 ** 注意 **

  • 该方法通过一个类似构造函数的函数来创建对象
  • 该函数会执行对象的拷贝,并可以进行扩展,然后返回对象

借用构造函数:

实例:

function Child() {
Parent.apply(this,
arguments);
}

分类: 基于构造函数的模式

** 注意 **:

  • 仅继承自身属性
  • 与方法一结和使用方便继承原型
  • 方便于子对象继承某个对象的具体属性

构造器于属性拷贝

实例:

function Child() {
Parent.apply(this,arguments);
}
extend2(Child,Parent);

分类: 基于构造器模式 使用原型链 属性拷贝 ** 注意 **

  • 借用构造器与原型属性拷贝的结合
  • 允许在不重复调用父对象构造器的情况下同时继承自身属性和原型属性

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏轮子工厂

6. 简单又复杂的“运算符”,建议你看一哈

昨天的《5. 很“迷”的字符与字符串》初稿本来很短的,但是我觉得内容太少了,就加了一些,结果好像就变得特别多〒▽〒。

10030
来自专栏互联网杂技

排序算法性能比较

所谓排序,即将原来无序的一个序列重新排列成有序的序列。 排序方法中涉及到稳定性,所谓稳定性,是指待排序的序列中有两个或两个以上相同的项,在排序前和排序后看这些相...

39670
来自专栏用户3030674的专栏

java上转型和下转型(对象的多态性)

/*上转型和下转型(对象的多态性) *上转型:是子类对象由父类引用,格式:parent p=new son *也就是说,想要上转型的前提必须是有继承关系的两...

41810
来自专栏游戏开发那些事

【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

  自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书...

11730
来自专栏Java开发者杂谈

JDK1.7新特性(4):java语言动态性之反射API

直接通过一个代码示例来熟悉java中通过反射来对构造函数/域以及方法处理的相关API: 1 package com.rampage.jdk7.chapter...

32080
来自专栏Android开发指南

2 :基本语法

372110
来自专栏程序员互动联盟

【编程基础】C++ Primer快速入门之七:运算符

一、表达式的定义 什么是表达式?表达式,是由数字、运算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合(1)。1 + 2是个...

32140
来自专栏Linux驱动

23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数  上章链接: 22.C++- 继承与组合,protected访问级别

继承方式 继承方式位于定义子类的”:”后面,比如: class Line : public Object //继承方式是public {...

34690
来自专栏CDA数据分析师

Python 面试中8个必考问题

? 翻译 everfighting 原文链接:https://www.toptal.com/python/interview-questions Q1、下...

35690
来自专栏程序员互动联盟

【编程基础】零基础学习Java之运算符

学习计算机编程语言都会遇到运算符这一知识点,运算符这个知识点是教怎么运用编程语言进行最基本的数据处理,下面就讲一下在Java语言中运算符是怎么回事。 1、算术运...

421100

扫码关注云+社区

领取腾讯云代金券