Javascript面向对象特性实现(封装、继承、接口)

Javascript作为弱类型语言,和Java、php等服务端脚本语言相比,拥有极强的灵活性。对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效;但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends、implement)。为了实现这些面向对象的特性,需要额外编写一些代码,如下。

在开始使用OO特性之前,还需要考虑使用接口、继承所带来的弊端。封装、接口、继承都将使代码结构变得复杂,对于编码新手有较高的要求,对于别人接受你的项目成本也提高了,在团队协作中需要根据具体需求斟酌,不要为了秀技术而写代码;同时,封装和接口都将带来一些额外的内存开销,有些可以忽略不计,有些 则是得不偿失,需要注意。

一、封装

  1. var book = (function(){
  2. var COUNT = 0;
  3.  
  4. //静态私有方法
  5. function checkISBN(isbn){
  6. return true;
  7. }
  8. //构造器
  9. var ctor = function(id,name,isbn){
  10. var _id,_name,_isbn
  11. this.setId= function(id){
  12. _id=id;
  13. }
  14. this.getId = function(){
  15. return _id;
  16. }
  17. this.setName = function(name){
  18. _name = name;
  19. }
  20. this.getName = function(){
  21. return name;
  22. }
  23. this.setIsbn = function(isbn){
  24. _isbn = isbn;
  25. }
  26. this.getIsbn = function(){
  27. return isbn;
  28. }
  29. if(checkISBN){
  30. COUNT++;
  31. }
  32. this.setName(name);
  33. this.setId(id);
  34. this.setIsbn(isbn);
  35. }
  36. ctor.getCount = function(){
  37. return COUNT;
  38. }
  39. return ctor;
  40. })();
  41. //静态、共用方法
  42. book.buyCount = function(count){
  43. return count;
  44. }
  45.  
  46. book.prototype = {
  47. display:function(){
  48. }
  49. }
  50. var b = new book();
  51. b.getCount();
  52. b.display();

二、接口

  1. /**
  2. * 接口:实现多个类的共同性。让彼此不想关的对象也能被同等对待。
  3. */
  4.  
  5. var Interface = function(name,method){
  6. if(arguments.length < 2){
  7. throw new Error("xxx");
  8. }
  9. this.name = name;
  10. this.method = [];
  11. for(var i = 0;i<method.length;i++){
  12. if(typeof method[i] !== 'string'){
  13. throw new Error("xxx");
  14. }
  15. this.method.push(method[i]);
  16. }
  17. }
  18. //public static method
  19. Interface.ensureImplement = function(object){
  20. for(var i = 0;i<arguments.length;i++){
  21. var interface = arguments[i];
  22. if(Interface.construction !== Interface){
  23. throw new Error("xxx");
  24. }
  25. for(var j = 0;j<ingerface.method.length;j++){
  26. var method = interface.method[j];
  27. if(!object[method] || typeof object[method] !==='function'){
  28. throw new Error("xxx");
  29. }
  30. }
  31. }
  32. }
  33.  
  34. var testResultInstance = new Interface("testResultInstance",["getData","getResults"]);
  35. function testInterface = function(mapInstance){
  36. Interface.ensureImplement(mapInstance,testResultInstance);
  37. mapInstance.getData();
  38. mapInstance.getResults();
  39. }
  40. function Map(name){
  41. this.name = name;
  42. this.getData = function(){};
  43. this.getResults = function(){};
  44. }
  45. var mapInstance = new Map("test");
  46. testInterface(mapInstance);

三、继承

  1. /**
  2. * 继承提供一些代码复用的功能。但继承照成两个类间的强耦合
  3. */
  4. //类式继承
  5. function Person(name){
  6. this.name = name;
  7.  
  8. }
  9. function Design(name,book){
  10. Person.call(this,name);
  11. this.book = book;
  12. }
  13. extend(Person,Desion);
  14. Design.prototype.getBooks = function(){
  15. return this.book;
  16. }
  17. var d = new Design("tim","test");
  18. d.getBooks();
  19. d.name;
  20.  
  21. function extend(superclass,subclass){
  22. var F = function(){};
  23. F.prototype = superclass.prototype;
  24. subclass.prototype = new F();
  25. subclass.prototype.constructor = subclass
  26.  
  27. subclass.superclass = superclass;
  28. if(superclass.prototype.constructor == Object.prototype.constructor){
  29. superclass.prototype.constructor = superclass;
  30. }
  31. }
  32. /********************************************************************/
  33. //原型继承
  34. function clone(superclass){
  35. var F = function(){};
  36. F.prototype = superclass;
  37. return new F();
  38. }
  39. var Person = {
  40. name:"default",
  41. getName : function(){
  42. return this.name;
  43. }
  44. };
  45. var Desion = clone(Person);
  46. Desion.books = ["写给大家看的设计书"];
  47. Desion.getBooks = function(){
  48. return this.books;
  49. }
  50. /********************************************************************/
  51. //参元法
  52. var Mimin = function(){};
  53. Mimin.prototype = {
  54. name : 'default',
  55. getName : function(){
  56. return this.name;
  57. }
  58. };
  59. function augment(receiveingClass,givingClass){
  60. for(methodName in givingClass){
  61. if(!receiveingClass[methodName]){
  62. receiveingClass[methodName] = methodName;
  63. }
  64. }
  65. }

Javascript面向对象实现分页

  1. <script type="text/javascript">
  2. function Map() {
  3. this.keys = new Array();
  4. this.data = new Array();
  5. //添加键值对
  6. this.set = function (key, value) {
  7. if (this.data[key] == null) {//如键不存在则身【键】数组添加键名
  8. this.keys.push(key);
  9. }
  10. this.data[key] = value; //给键赋值
  11. };
  12. //获取键对应的值
  13. this.get = function (key) {
  14. return this.data[key];
  15. };
  16. //去除键值,(去除键数据中的键名及对应的值)
  17. this.remove = function (key) {
  18. this.keys.remove(key);
  19. this.data[key] = null;
  20. };
  21. //判断键值元素是否为空
  22. this.isEmpty = function () {
  23. return this.keys.length == 0;
  24. };
  25. //获取键值元素大小
  26. this.size = function () {
  27. return this.keys.length;
  28. };
  29. }
  30.  
  31. function dataGrid(obj) {
  32. if (obj == null) {
  33. return alert("请填入参数");
  34. }
  35. this.dataArray = new Map();
  36. this.index = 0;
  37. this.data = obj.data != null ? obj.data : "";
  38. this.maxPage = 0;
  39. this.pageNumber = 1;
  40. this.pageSize = obj.pageSize != null ? obj.pageSize : 10;
  41. this.pageToal = 0;
  42. this.dataGrid = new Array();
  43. }
  44.  
  45. dataGrid.prototype.getDataGrid = function (index) {
  46. this.dataGrid.splice(0, dataGrid.length);
  47. var page = index * this.pageSize + this.pageSize;
  48. if (this.pageToal - page > this.pageSize) {
  49. page = page;
  50. } else if (this.pageToal - page < this.pageSize && this.pageToal - page > 0) {
  51. page = index * this.pageSize + (this.pageToal - page);
  52. } else {
  53. page = index * this.pageSize + this.pageToal;
  54. }
  55. for (var i = index * this.pageSize; i < page; i++) {
  56. this.dataGrid[this.dataArray.keys[i]] = this.dataArray.data[this.dataArray.keys[i]];
  57. }
  58. }
  59.  
  60. dataGrid.prototype.packageing = function (obj) {
  61. var data = obj ? obj : this.data;
  62. for (var items in data) {
  63. this.dataArray.set(items, data[items]);
  64. this.pageToal++;
  65. }
  66. this.maxPage = Math.ceil(this.pageToal / this.pageSize);
  67. this.getDataGrid(this.index);
  68. }
  69. dataGrid.prototype.load = function () {
  70. this.packageing();
  71. return this.dataGrid;
  72. }
  73.  
  74. dataGrid.prototype.goit = function (index) {
  75. if (index * this.pageSize > this.pageToal) {
  76. return;
  77. } else {
  78. this.getDataGrid(index - 1);
  79. }
  80. return this.dataGrid;
  81.  
  82. }
  83. </script>

Javascript面向对象特性实现封装、继承、接口详细案例的更多相关文章

  1. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  2. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  3. .NET面向对象特性之封装

    .NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...

  4. (一)Javascript 面向对象编程:封装

    Javascript 面向对象编程:封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP ...

  5. PHP面向对象 实例化 构造函数 封装 继承 静态

    PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...

  6. Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)

    Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...

  7. Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态

    一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  8. python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态

    一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  9. javascript面向对象(一):封装

    本文来自阮一峰 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学 ...

随机推荐

  1. 低电平ViL

    低电平 编辑 低电平(Vil)指的是保证逻辑门的输入为低电平时所允许的最大输入低电平,当输入电平低于Vil时,则认为输入电平为低电平.   中文名 低电平 外文名 Vil 主要应用 测量电缆和保护连接 ...

  2. nginx thinkphp只能访问首页

    代码部署到了服务器上,发现无论怎样请求,都是跳转到index/index/index(模块/控制器/方法),最后需要nginx重新地址即可 参考:Linux下Nginx部署Thinkphp5访问任何地 ...

  3. 如何优雅的解决mac安装zsh不执行.bash_profile

    最近刚刚重装了系统,并安装了优雅的shell命令工具zsh,突然发现我放在我的工作目录下的.bash_profile居然在启动的时候执行,导致我的java的一些配置没有注册到bash中.然后查资料得知 ...

  4. (一)flask-sqlalchemy的安装和配置

    在使用flask-sqlalchemy之前要先了解ORM模型,什么叫做ORM模型 一.什么是ORM ORM 全拼Object-Relation Mapping. 称为对象-关系映射 主要实现模型对象到 ...

  5. 解题:HAOI2018 苹果树

    题面 统计贡献,每个大小为i的子树贡献就是$i(n-i)$,然后子树里又有$i!$种:同时这个子树的根不确定,再枚举这个根是$r$个放的,又有了$r!$种.子树内选点的方式因为子树的根被钦定了顺序所以 ...

  6. NLog类库使用探索——编程配置

    以编程的方式配置,这是我项目中的,我都不知道为什么使用编程.直接配置不很好吗,估计他也没有研究.直接上步骤和代码: 创建一个LoggingConfiguration对象,用来保存配置信息 至少创建一个 ...

  7. Flask filter过滤器

    简单的数据集体添加样式输出用管道过滤,除了flask模块以外不需要导其他的包 <head> <meta charset="UTF-8"> <meta ...

  8. 2018.11.26 QLU新生赛部分题解

    问题 L: 寄蒜几盒? 题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Ye ...

  9. 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能

    在监控摄像机安装后,往往需要设置IP等信息,在IP不知道的情况下,IP搜索是一个很常见也必须的功能. 考虑到设备IP和当前局域网可能不在同一个网段,ARP是一个不错的选择. 首先安装WinPcap软件 ...

  10. Java项目中,如何限制每个用户访问接口的次数

    转自:https://blog.csdn.net/qq_30947533/article/details/78844709 方法1:数据访问量大的话 用redis来做,用户在调用短信接口时,先根据用户 ...