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


Posted in Javascript onDecember 29, 2014

此方法并非笔者原创,笔者只是在前辈的基础上,加以总结,得出一种简洁实用的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!
Javascript 相关文章推荐
jQuery EasyUI API 中文文档 - NumberBox数字框
Oct 13 Javascript
javascript与有限状态机详解
May 08 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
js仿微博实现统计字符和本地存储功能
Dec 22 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
如何判断Javascript对象是否存在的简单实例
May 18 Javascript
浅谈js中的三种继承方式及其优缺点
Aug 10 Javascript
AngularJS中比较两个数组是否相同
Aug 24 Javascript
纯js实现的积木(div层)拖动功能示例
Jul 19 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
Nov 06 Javascript
javascript实现QQ空间相册展示源码
Dec 12 Javascript
在element-ui的select下拉框加上滚动加载
Apr 18 Javascript
JavaScript中的console.assert()函数介绍
Dec 29 #Javascript
jQuery中:eq()选择器用法实例
Dec 29 #Javascript
根据配置文件加载js依赖模块
Dec 29 #Javascript
JavaScript中的console.dir()函数介绍
Dec 29 #Javascript
JavaScript中的console.group()函数详细介绍
Dec 29 #Javascript
小米公司JavaScript面试题
Dec 29 #Javascript
谷歌浏览器调试JavaScript小技巧
Dec 29 #Javascript
You might like
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php实现微信发红包功能
2018/07/13 PHP
Jquery插件之多图片异步上传
2010/10/20 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
广州品高软件.net笔面试题目
2012/04/18 面试题
小学教师暑期培训方案
2014/08/28 职场文书
设备技术员岗位职责
2015/04/11 职场文书
教师培训简讯
2015/07/20 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS