JS 设计模式 三(继承)

news/2024/7/8 12:08:52

什么是继承

继承是一种减少重复性代码的一种设计模式,尽量弱化对象间耦合,开闭原则的一种很好的实现。

javascript继承

由于javascript的语言特性,它的继承也被分为了3中实现方式

一、类继承

function extend(subClass, superClass) {
  var F = function () {
  };
  F.prototype = superClass.prototype;
  subClass.prototype = new F();
  subClass.prototype.constructor = subClass;

  subClass.superclass = superClass.prototype;
  if (superClass.prototype.constructor == Object.prototype.constructor) {
    superClass.prototype.constructor = superClass;
  }
}

function Person(name) {
  this.name = name;
}
Person.prototype.getName = function () {
  return this.name;
}
function Author(name, books) {
  Author.superclass.constructor.call(this, name);
  this.books = books;
}
extend(Author, Person);
Author.prototype.getBooks = function () {
  return this.books;
};
Author.prototype.getName = function () {
  var name = Author.superclass.getName.call(this);
  return name + ', Author of ' + this.getBooks().join(', ');
};

var hugo = new Author('hugo', ['Notre-Dame de Paris']);
hugo.getName();
hugo.getBooks();

这种继承方式比较适合不熟悉javascript语言原型的程序员使用。

二、原型继承

function clone(object) {
  function F() {
  }

  F.prototype = object;
  return new F;
}

var Person = {
  name: '默认值',
  getName: function () {
    return this.name;
  }
}

var Author = clone(Person);
Author.books = []; // Default value.
Author.getBooks = function() {
  return this.books;
}
hugo = clone(Author);
hugo.name = 'hugo';
hugo.books =['Notre-Dame de Paris'];
hugo.getName();
hugo.getBooks();

这种继承比较节约内存。但是理解更加复杂。起属性默认值指向父类属性。

三、掺元类

function augment(receivingClass, givingClass) {
  if(arguments[2]) { // Only give certain methods.
    for(var i = 2, len = arguments.length; i < len; i++) {
      receivingClass.prototype[arguments[i]] = givingClass.prototype[arguments[i]];
    }
  }
  else { // Give all methods.
    for(methodName in givingClass.prototype) {
      if(!receivingClass.prototype[methodName]) {
        receivingClass.prototype[methodName] = givingClass.prototype[methodName];
      }
    }
  }
}

var Mixin = function() {};
Mixin.prototype = {
  serialize: function() {
    var output = [];
    for(key in this) {
      output.push(key + ': ' + this[key]);
    }
    return output.join(', ');
  }
};

function Person(name) {
  this.name = name;
}
Person.prototype.getName = function () {
  return this.name;
}

augment(Person, Mixin,'serialize');
var hugo = new Person('hugo');
hugo.serialize();

这种继承方式是为了扩充类的一些重复函数而不重写代码,这个也是一种多继承的效果。

总结

javascript的继承大体上使用原型的方式会比较节省内存空间,不过也有一定的使用难度。不过在理解了原型以后就可以这是一种非常简化的继承方式,对于扩展也很方便。所以在使用javascript的继承前,最好可以很好的理解下原型链这个概念。


http://www.niftyadmin.cn/n/2613046.html

相关文章

bzoj2338[HNOI2011]数矩形

bzoj2338[HNOI2011]数矩形 题意&#xff1a; n个顶点&#xff0c;找一个矩形&#xff0c;使其面积最大。注意&#xff1a;矩形的边不一定要和坐标轴平行&#xff01; 题解&#xff1a; 先将点两两组成线段&#xff0c;然后将它们按中点和长度排序&#xff0c;则每组中点和长度都…

生成可执行文件

Linux系统中的可执行文件生成 C语言可执行文件生成举例&#xff1a; 生成一个可执行文件可包括&#xff1a; 在Linux下编写C语言程序 打开一个文件 $vim sssr.c输入一个程序 #include<stdio.h> #include<stdlib.h> #include<time.h> int main() {int…

Java学习笔记(七):内部类、静态类和泛型

内部类 在Java中&#xff0c;可以将一个类定义在另一个类里面或者一个方法里面&#xff0c;这样的类称为内部类。广泛意义上的内部类一般来说包括这四种&#xff1a;成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。 成员内部类 成员内…

(概念,好处,区别,联系)数据,数据库,数据库系统,数据库管理系统

概念&#xff08;concept&#xff09; 数据&#xff1a;数据库中存储的基本对象 数据库&#xff1a;存储数据的库 数据库管理系统&#xff1a;一个用于获取&#xff0c;组织&#xff0c;存储和维护的系统软件 数据库系统&#xff1a;包括数据库&#xff0c;数据管理系统&am…

局部敏感哈希Locality Sensitive Hashing(LSH)之随机投影法

1. 概述 LSH是由文献[1]提出的一种用于高效求解最近邻搜索问题的Hash算法。LSH算法的基本思想是利用一个hash函数把集合中的元素映射成hash值&#xff0c;使得相似度越高的元素hash值相等的概率也越高。LSH算法使用的关键是针对某一种相似度计算方法&#xff0c;找到一个具有以…

将一个对象里所有的空值属性设置成null

2019独角兽企业重金招聘Python工程师标准>>> /*** 将一个对象里所有的空值属性设置成null* param o* return*/public Object changeToNull(Object o){Class co.getClass();try {Field[] fsc.getDeclaredFields();for (Field f : fs) {f.setAccessible(true);String …

mysql语句如何比较日期_mysql,_Mysql如何按照日期对比数据,求SQL语句,mysql - phpStudy...

Mysql如何按照日期对比数据,求SQL语句/*Navicat MySQL Data TransferTarget Server Type : MYSQLTarget Server Version : 50629File Encoding : 65001Date: 2016-09-05 13:57:13*/SET FOREIGN_KEY_CHECKS0;-- ------------------------------ Table structure for student-- -…

《机器学习实战》AdaBoost算法的分析与实现

《机器学习实战》系列博客是博主阅读《机器学习实战》这本书的笔记也包含一些其他python实现的机器学习算法github 源码同步&#xff1a;https://github.com/Thinkgamer/Machine-Learning-With-Python 算法实现均采用Python 如需转载请注明出处&#xff0c;谢谢 1…