[原创]Javascript模拟“类”的综合实现方式以及部分细节【截至ES6】
前言
 
  最近几个旧项目里使用的图片编辑插件出现Bug, 经Review 后确定需要在其内外均做些改动,但是头疼的发现部分页面里的JavaScript 代码被冗余了NN次。部分新同事堆叠了大量的过程式的脚本块(几乎没有利用面向对象封装的概念-虽然面向对象也按需择时),改起来挺累(而且几个项目里各自不同)。本身插件问题已经解决,但是就代码这块儿,针对面向对象的抽离封装,反而想写些东西。虽然没有太多分享价值,自己也忘记不少,翻了下以前的各种代码草稿,还是想尽量做些相对完整的记录和分享。当然,文中若有不妥,欢迎指正。
 
正文
 
  JavaScript 编程本身是不包含传统“类”的概念的,这是不同于我们偏后端的一些强类型对象语言的(例如Java、C#等),而我们往往会利用funciton、 prototype 等关键字来实现一个类似“类”的原型模型(当然也包括各种继承特性)。从而使得项目中的js更优美,更高效。(截至最新的ECMAScript6里也推出了更简单的标准实现,后面会有相关演示)
 
注:所有Demo 均可直接在我的github上下载(地址:https://github.com/tempbing/Javascript-ClassDemos
 
 
一、首先模拟一个基础版的“类”,常规方式,利用function 和 this 关键字。(这里this关键字 代表调用的当前实例“对象”,不赘述,但初学者一定要深入理解,以前专业书里讲了几十页)。
Tips:这里稍微留意下代码里的相关注释
 
 
相关使用EG:
 
 
二、然后在这个基础"类"上,额外附加更多特征,直接操作prototype演变成一个丰富的“类”(另:这里有些小细节问题,注意下我在注释里说到的部分细节):
 
 
相关使用EG - 读取,这里是一致:
 
 
相关使用EG - 更新,这里则有些需要注意(代码里也包含了详细注释提醒,这里不做主要扩展):
 
 
还是用文字方式啰嗦提醒下:
 
当进行对象原型上的操作时(这里特指使用prototype 附加操作),需要注意一个容易遗漏的关于内存堆栈的小细节。由于数组(这里是Product原型附加的“tags”)属于引用类型(或者说对象类型),如果用类似于C语言里的指针概念解释则更形象,开辟的内存堆栈空间上,若为引用型,修改了该引用的具体值,那么影响的是所有指向当前堆空间的变量。所以上面修改了product02的 tags值后,再查看product01的 tags值也是同样发生了改变。当然,如果直接改了栈值(或者说指针标记),则等同于将当前指针指向了其他堆空间,属于自身改变了,当然就不会影响到指向原来堆的其他标记(比如操作:product02.tags=['AutumnBing'])。 另:其实很多地方均有这样的概念,容易入坑,这里暂且不深入,注意这个小细节就好)
 
三、关于继承,先利用prototype 原型链做个不是太推荐的简单继承(毕竟原型链的操作需要用到恰当地方,见demo):
 
 
相关使用EG:
 
 
 
四、更妥当的继承方式,结合“call” 内部回调,操作上下文来实现,也更安全:
 
 
相关使用EG:
 
 
 
五、目前最新的ES6 中直接推出了专属class概念,作为对象的模板,通过class关键字,可以直接定义封装类 (个人认为更像是一个基于prototype的语法糖,但最起码比ES5的Object.create() 半成品更佳)。
 
 
相关使用EG:
 
 
 
六、同样,针对class,也拥有了新的继承方式。增加extends和super,更加精简直观,这非常类似于JAVA/C#等强类型语言中的继承方式:
 
 
相关使用EG:
 
 
 
结语
 
某些时候,我们对于是否面向对象的编程,会有一些实际考虑。但在代码的模块化、插件化开发里,需是毫无疑问的怀抱面向对象的理念。有些东西并不复杂,但延伸的概念和细节依然需要注意。以上本人结合现有知识,进行归纳和总结了关于“类”的一些相关实现方式,包括一些细节问题。如有不妥之处,欢迎各种方式的指正。所有demo,完整演示代码,刚才已全部提交到我的github上去了(地址:https://github.com/tempbing/Javascript-ClassDemos)。夜深了,准备睡了。
 
End.
 
 

[原创]Javascript模拟“类”的综合实现方式以及部分细节【截至ES6】的更多相关文章

  1. javascript创建类的6种方式

    javascript创建类的7种方式 一 使用字面量创建 1.1 示例 var obj={}; 1.2 使用场景 比较适用于临时构建一个对象,且不关注该对象的类型,只用于临时封装一次数据,且不适合代码 ...

  2. javascript定义类或对象的方式

    本文介绍的几种定义类或对象的方式中,目前使用最广泛的是:混合的构造函数/原型方式.动态原型方式.不要单独使用经典的构造函数或原型方式. 工厂方式 构造器函数 原型方式 混合的构造函数/原型方式 动态原 ...

  3. JavaScript定义类的几种方式

    提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...

  4. JavaScript创建类的三种方式

    //第一种 创建类方法. // 用方法模拟 构造函数. function classobj() { this.name = 'xiaoming'; } classobj.text = 'text'; ...

  5. javascript模拟类的最佳实践

    1:怎样模拟一个类 在sencha touch2 系列里面定义一个类和new出这个类的对象 Ext.define( "Animal", { config: { name: null ...

  6. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  7. [转]Javascript定义类的三种方法

    作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...

  8. Atitit.javascript 实现类的方式原理大总结

    Atitit.javascript 实现类的方式原理大总结 1. 实现类的式::构造方法方式:原型方式:构造方法+原型的混合方式 1 2. 原型方式(function mode)经典式..实现属性推荐 ...

  9. JavaScript 高级篇之闭包、模拟类,继承(五)

    本篇主要分享我对闭包的理解及使用闭包完成私有属性.模拟类.继承等,结合大量例子,希望大家能快速掌握!首先让我们先从一些基本的术语开始吧     一.javascript中的闭包 1.我们一起先来理解什 ...

随机推荐

  1. Lombok(1.14.8)的简单示例

    分享自: http://blog.csdn.net/huey2672/article/details/42240985 Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长,尤其 ...

  2. leetcode — longest-substring-without-repeating-characters

    import java.util.HashSet; import java.util.Set; /** * Source : https://oj.leetcode.com/problems/long ...

  3. 【详解】Spring Security 之 SecurityContext

    前言 本文主要整理一下SecurityContext的存储方式. SecurityContext接口 顾名思义,安全上下文.即存储认证授权的相关信息,实际上就是存储"当前用户"账号 ...

  4. loggin(日志模块)

    这是一个提供日志功能的模块,它可以让你更敏捷的为你程序提供日志功能 一.常用日志记录场景及最佳解决方案: 日志记录方式 最佳记录日志方案 普通情况下,在控制台显示输出 print()报告正常程序操作过 ...

  5. H5实现魔方游戏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 转STM32官方固件库简介

    ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32 固件库.固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API) .固件库将这些寄 ...

  7. Docker 安装redis(四)

    Docker 安装redis 1.搜索docker镜像(可以看到搜索的结果,这个结果是按照一定的星级评价规则排序的) docker search redis 2.拉取docker的mysql镜像(如果 ...

  8. elasticsearch6.7 05. Document APIs(6)UPDATE API

    5. UPDATE API 更新操作可以使用脚本来更新.更新的时候会先从索引中获取文档数据(在每个分片中的集合),然后运行脚本(使用可选的脚本语言和参数),再果进行索引(还允许删除或忽略该操作).它使 ...

  9. Nhibernate学习的第一天

    书本:https://www.tutorialspoint.com/nhibernate/index.htm 第一天学习内容 概念 Nhibernate是一个ORM框架. ORM框架:将声明的类映射到 ...

  10. JavaScript复杂判断的更优雅写法

    摘要: 写代码是一门艺术. 原文:JavaScript 复杂判断的更优雅写法 作者:Think. 公众号:大转转fe Fundebug经授权转载,版权归原作者所有. 前提 我们编写js代码时经常遇到复 ...