此方法并非笔者原创,笔者只是在前辈的基础上,加以总结,得出一种简洁实用的JavaScript继承方法。

传统的JavaScript继承基于prototype原型链,并且需要使用大量的new操作,代码不够简洁,可读性也不是很强,貌似还容易受到原型链污染。

笔者总结的继承方式,简洁明了,虽然不是最好的方式,但希望能给读者带来启发。

好了,废话不多说,直接看代码,注释详尽,一看就懂~~~

  1. /**
  2. * Created by 杨元 on 14-11-11.
  3. * 不使用prototype实现继承
  4. *
  5. */
  6.  
  7. /**
  8. * Javascript对象复制,仅复制一层,且仅复制function属性,不通用!
  9. * @param obj 要复制的对象
  10. * @returns Object
  11. */
  12. Object.prototype.clone = function(){
  13. var _s = this,
  14. newObj = {};
  15. _s.each(function(key, value){
  16. if(Object.prototype.toString.call(value) === "[object Function]"){
  17. newObj[key] = value;
  18. }
  19. });
  20. return newObj;
  21. };
  22.  
  23. /**
  24. * 遍历obj所有自身属性
  25. *
  26. * @param callback 回调函数。回调时会包含两个参数: key 属性名,value 属性值
  27. */
  28. Object.prototype.each = function(callback){
  29. var key = "",
  30. _this = this;
  31. for (key in _this){
  32. if(Object.prototype.hasOwnProperty.call(_this, key)){
  33. callback(key, _this[key]);
  34. }
  35. }
  36. };
  37.  
  38. /**
  39. * 创建子类
  40. * @param ext obj,包含需要重写或扩展的方法。
  41. * @returns Object
  42. */
  43. Object.prototype.extend = function(ext){
  44. var child = this.clone();
  45. ext.each(function(key, value){
  46. child[key] = value;
  47. });
  48. return child;
  49. };
  50.  
  51. /**
  52. * 创建对象(实例)
  53. * @param arguments 可接受任意数量参数,作为构造器参数列表
  54. * @returns Object
  55. */
  56. Object.prototype.create = function(){
  57. var obj = this.clone();
  58. if(obj.construct){
  59. obj.construct.apply(obj, arguments);
  60. }
  61. return obj;
  62. };
  63.  
  64. /**
  65. * Useage Example
  66. * 使用此种方式继承,避免了繁琐的prototype和new。
  67. * 但是目前笔者写的这段示例,只能继承父类的function(可以理解为成员方法)。
  68. * 如果想继承更丰富的内容,请完善clone方法。
  69. *
  70. *
  71. */
  72.  
  73. /**
  74. * 动物(父类)
  75. * @type {{construct: construct, eat: eat}}
  76. */
  77. var Animal = {
  78. construct: function(name){
  79. this.name = name;
  80. },
  81. eat: function(){
  82. console.log("My name is "+this.name+". I can eat!");
  83. }
  84. };
  85.  
  86. /**
  87. * 鸟(子类)
  88. * 鸟类重写了父类eat方法,并扩展出fly方法
  89. * @type {子类|void}
  90. */
  91. var Bird = Animal.extend({
  92. eat: function(food){
  93. console.log("My name is "+this.name+". I can eat "+food+"!");
  94. },
  95. fly: function(){
  96. console.log("I can fly!");
  97. }
  98. });
  99.  
  100. /**
  101. * 创建鸟类实例
  102. * @type {Jim}
  103. */
  104. var birdJim = Bird.create("Jim"),
  105. birdTom = Bird.create("Tom");
  106.  
  107. birdJim.eat("worm"); //My name is Jim. I can eat worm!
  108. birdJim.fly(); //I can fly!
  109.  
  110. birdTom.eat("rice"); //My name is Tom. I can eat rice!
  111. birdTom.fly(); //I can fly!

JavaScript简洁继承机制实现(不使用prototype和new)的更多相关文章

  1. Javascript类继承-机制-代码Demo【原创】

    最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...

  2. JavaScript中继承机制的模仿实现

    首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ...

  3. 深入了解JavaScript中基于原型(prototype)的继承机制

    原型 前言 继承是面向对象编程中相当重要的一个概念,它对帮助代码复用起到了很大的作用. 正文 Brendan Eich在创建JavaScript时,没有选择当时最流行的类继承机制,而是借鉴Self,用 ...

  4. JavaScript 原型与继承机制详解

    引言 初识 JavaScript 对象的时候,我以为 JS 是没有继承这种说法的,虽说 JS 是一门面向对象语言,可是面向对象的一些特性在 JS 中并不存在(比如多态,不过严格来说也没有继承).这就困 ...

  5. JavaScript大杂烩4 - 理解JavaScript对象的继承机制

    JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...

  6. javascript深度克隆与javascript的继承实现

    1.javascript深度克隆: //注意这里的对象包括object和array function cloneObject(obj){ var o = obj.constructor === Arr ...

  7. javascript 之 prototype继承机制

    理解Javascript语言的继承机制 javascript没有"子类"和"父类"的概念,也没有"类"(class)和"实例&qu ...

  8. Javascript prototype 及 继承机制的设计思想

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

  9. javascript继承机制 & call apply使用说明

    一.继承机制 1.对象冒充:构造函数使用 this 关键字给所有属性和方法赋值,可使 ClassA 构造函数成为 ClassB 的方法,然后调用它. function ClassZ() { this. ...

随机推荐

  1. eclipse中导入项目后中文成乱码解决办法

    转自:http://blog.163.com/lang_zi_ming/blog/static/1140161762010412112650774/ 编程时在往eclipse中导入项目后 项目中的中文 ...

  2. Howto: 如何将ArcGIS Server缓存移动到新服务器

     Howto: 如何将ArcGIS Server缓存移动到新服务器 文章编号: 33686 软件: ArcGIS Server 9.2, 9.3, 9.3.1 操作系统: Windows 2000, ...

  3. Selenium2+python自动化16-alert\confirm\prompt

    前言 不是所有的弹出框都叫alert,在使用alert方法前,先要识别出到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决. alert\confirm\prompt ...

  4. 技术英文单词贴--R

    R redirect 重定向,改变方向 reference 参考,提及,引用 register 注册,登记,挂号 render 渲染 represent 代表,象征 route 路线,路由,通道 ro ...

  5. 判断是苹果还是安卓app联调

    //app苹果联调 function iosReload(){ //window.webkit.messageHandlers.signUpSuccess.postMessage(null); } / ...

  6. 利用fiddler模拟发送json数据的post请求

    fiddler是调试利器,有许多好用的功能,这里简单的介绍一下利用fiddler模拟发送post请求的例子 先简单介绍一下失败的例子,最后给出正确的方法

  7. echo 换行不换行

    echo换行输出需要转义符 -e 看以下例子: echo -e "It is the first line." >> a; echo -e "It is th ...

  8. XE3随笔11:Merge、Clone、ForcePath

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  9. js全局变量和局部变量

    <script> var i = 'yuanjianhang'; function myloveName() { alert(i); var i = 'guanxi'; } myloveN ...

  10. View的事件处理流程

    一直对view的事件处理流程迷迷糊糊,今天花了点时间写了个栗子把它弄明白了. 1.view的常用的事件分为:单击事件(onClick).长按事件(onLongClick).触摸事件(onTouch), ...