JavaScript不使用prototype和new实现继承机制

 更新时间:2014年12月29日 11:07:58   投稿:hebedich  
这篇文章主要介绍了JavaScript不使用prototype和new实现继承机制的相关资料,需要的朋友可以参考下

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

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

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

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

复制代码 代码如下:

 /**
  * Created by 杨元 on 14-11-11.
  * 不使用prototype实现继承
  *
  */
 /**
  * Javascript对象复制,仅复制一层,且仅复制function属性,不通用!
  * @param obj  要复制的对象
  * @returns  Object
  */
 Object.prototype.clone = function(){
     var _s = this,
         newObj = {};
     _s.each(function(key, value){
         if(Object.prototype.toString.call(value) === "[object Function]"){
             newObj[key] = value;
         }
     });
     return newObj;
 };
 /**
  * 遍历obj所有自身属性
  *
  * @param callback 回调函数。回调时会包含两个参数: key 属性名,value 属性值
  */
 Object.prototype.each = function(callback){
     var key = "",
         _this = this;
     for (key in _this){
         if(Object.prototype.hasOwnProperty.call(_this, key)){
             callback(key, _this[key]);
         }
     }
 };
 /**
  * 创建子类
  * @param ext obj,包含需要重写或扩展的方法。
  * @returns Object
  */
 Object.prototype.extend = function(ext){
     var child = this.clone();
     ext.each(function(key, value){
         child[key] = value;
     });
     return child;
 };
 /**
  * 创建对象(实例)
  * @param arguments 可接受任意数量参数,作为构造器参数列表
  * @returns Object
  */
 Object.prototype.create = function(){
     var obj = this.clone();
     if(obj.construct){
         obj.construct.apply(obj, arguments);
     }
     return obj;
 };
 /**
  * Useage Example
  * 使用此种方式继承,避免了繁琐的prototype和new。
  * 但是目前笔者写的这段示例,只能继承父类的function(可以理解为成员方法)。
  * 如果想继承更丰富的内容,请完善clone方法。
  *
  *
  */
 /**
  * 动物(父类)
  * @type {{construct: construct, eat: eat}}
  */
 var Animal = {
     construct: function(name){
         this.name = name;
     },
     eat: function(){
         console.log("My name is "+this.name+". I can eat!");
     }
 };
 /**
  * 鸟(子类)
  * 鸟类重写了父类eat方法,并扩展出fly方法
  * @type {子类|void}
  */
 var Bird = Animal.extend({
     eat: function(food){
         console.log("My name is "+this.name+". I can eat "+food+"!");
     },
     fly: function(){
         console.log("I can fly!");
     }
 });
 /**
  * 创建鸟类实例
  * @type {Jim}
  */
 var birdJim = Bird.create("Jim"),
     birdTom = Bird.create("Tom");
 birdJim.eat("worm");  //My name is Jim. I can eat worm!
 birdJim.fly();  //I can fly!
 birdTom.eat("rice");  //My name is Tom. I can eat rice!
 birdTom.fly();  //I can fly!

相关文章

  • 微信小程序常用的3种提示弹窗实现详解

    微信小程序常用的3种提示弹窗实现详解

    这篇文章主要介绍了微信小程序常用的3种提示弹窗实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • WEB前端开发框架Bootstrap3 VS Foundation5

    WEB前端开发框架Bootstrap3 VS Foundation5

    WEB前端开发框架Bootstrap3 VS Foundation5,这篇文章主要介绍了Bootstrap3与Foundation5的五大区别,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Google韩国首页图标动画效果

    Google韩国首页图标动画效果

    Google韩国首页图标动画效果...
    2007-08-08
  • JavaScript的原型继承详解

    JavaScript的原型继承详解

    这篇文章主要详细介绍了JavaScript的原型继承的相关资料,十分详细,需要的朋友可以参考下
    2015-02-02
  • 详解uniapp无痛刷新token方法

    详解uniapp无痛刷新token方法

    为了给用户一个流畅的体验,token过期后需要重新请求新的token替换过期的token。本文将详细介绍uniapp无痛刷新token方法。
    2021-06-06
  • 原生JS实现无缝轮播图片

    原生JS实现无缝轮播图片

    这篇文章主要为大家详细介绍了原生JS实现无缝轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • dess中一个简单的多路委托的实现

    dess中一个简单的多路委托的实现

    这个SDelegate用起来可能会比较诡异,比如很多操作都要重新赋值。Dess中,SDelegate主要用于一些特定场合,如DOM事件派发。
    2010-07-07
  • uni-app封装组件实现下方滑动弹出模态框效果

    uni-app封装组件实现下方滑动弹出模态框效果

    这篇文章主要介绍了uni-app封装组件实现下方滑动弹出模态框效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08
  • Cropper.js进阶之裁剪后保存至服务器实现详解

    Cropper.js进阶之裁剪后保存至服务器实现详解

    这篇文章主要为大家介绍了Cropper.js进阶之裁剪后保存至服务器实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • javascript兼容性(实例讲解)

    javascript兼容性(实例讲解)

    下面小编就为大家带来一篇javascript兼容性(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论