JavaScript简洁继承机制实现(不使用prototype和new)

此方法并非笔者原创,笔者只是在前辈的基础上,加以总结,得出一种简洁实用的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 /**
 66  * Useage Example
 67  * 使用此种方式继承,避免了繁琐的prototype和new。
 68  * 但是目前笔者写的这段示例,只能继承父类的function(可以理解为成员方法)。
 69  * 如果想继承更丰富的内容,请完善clone方法。
 70  *
 71  *
 72  */
 73
 74 /**
 75  * 动物(父类)
 76  * @type {{construct: construct, eat: eat}}
 77  */
 78 var Animal = {
 79     construct: function(name){
 80         this.name = name;
 81     },
 82     eat: function(){
 83         console.log("My name is "+this.name+". I can eat!");
 84     }
 85 };
 86
 87 /**
 88  * 鸟(子类)
 89  * 鸟类重写了父类eat方法,并扩展出fly方法
 90  * @type {子类|void}
 91  */
 92 var Bird = Animal.extend({
 93     eat: function(food){
 94         console.log("My name is "+this.name+". I can eat "+food+"!");
 95     },
 96     fly: function(){
 97         console.log("I can fly!");
 98     }
 99 });
100
101 /**
102  * 创建鸟类实例
103  * @type {Jim}
104  */
105 var birdJim = Bird.create("Jim"),
106     birdTom = Bird.create("Tom");
107
108 birdJim.eat("worm");  //My name is Jim. I can eat worm!
109 birdJim.fly();  //I can fly!
110
111 birdTom.eat("rice");  //My name is Tom. I can eat rice!
112 birdTom.fly();  //I can fly!
时间: 2024-12-20 20:08:28

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

JavaScript中继承机制的模仿实现

首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形.矩形和五边形都是多边形的一种,具有不同数量的边.正方形是矩形的一种,所有的边等长.这就构成了一种完美的继承关系. 在这个例子中,形状(Shape)是椭圆形(Ellipse)和多边形(Polygon)的基类(base class)(所有类都由它继承而来).椭圆具有一个属性 foci,说明椭圆具有的焦点

JavaScript 原型与继承机制详解

引言 初识 JavaScript 对象的时候,我以为 JS 是没有继承这种说法的,虽说 JS 是一门面向对象语言,可是面向对象的一些特性在 JS 中并不存在(比如多态,不过严格来说也没有继承).这就困惑了我很长的时间,当我学习到 JS 原型的时候,我才发现了 JS 的新世界.本篇文章讲解了 JavaScript new 操作符与对象的关系.原型和对象关联(也就是俗称的继承)的原理,适合有一定基础的同学阅读. 一.JavaScript 的类与对象 许多书籍上都会说到如何在 JS 当中定义“类”,通

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

1.javascript深度克隆: //注意这里的对象包括object和array function cloneObject(obj){ var o = obj.constructor === Array ? [] : {}; for(var key in obj){ if(obj.hasOwnProperty(key)){ o[key] = typeof obj[key] === "object" ? cloneObject(obj[key]) : obj[key]; } } ret

javascript 之 prototype继承机制

理解Javascript语言的继承机制 javascript没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承. 1.引言 1994年,网景公司急需一种网页脚本语言,使得浏览器可以与网页互动.工程师Brendan Eich 负责开发这种新语言.他觉得,没必要设计得很复杂,这种语言只要能够完

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

一.继承机制 1.对象冒充:构造函数使用 this 关键字给所有属性和方法赋值,可使 ClassA 构造函数成为 ClassB 的方法,然后调用它. function ClassZ() { this.newMethod = ClassX; this.newMethod(); delete this.newMethod; this.newMethod = ClassY; this.newMethod(); delete this.newMethod; } 这里存在一个弊端,如果存在两个类 Clas

重温Javascript继承机制

原文:http://mozilla.com.cn/post/21667/ =========================== 上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Javascript原名Mocha,当时还叫做LiveScript,创造者是Brendan Eich,现任Mozilla公司首席技术官. 1994年,历史上第一个比较成熟的网

【JavaScript】重温Javascript继承机制

上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Javascript原名Mocha,当时还叫做LiveScript,创造者是Brendan Eich,现任Mozilla公司首席技术官. 1994年,历史上第一个比较成熟的网络浏览器——Navigator0.9版诞生在网景公司(Netscape),极为轰动.但是,Navigator0.9只能用来浏览,不

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

面向对象之继承 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承(没有指定父类的对象,都被认为是从Object继承的). 在前面我们讨论了面向对象的封装性,在最后的地方也谈到了JavaScript的继承是通过原型和原型链实现的,下面我们就详细的展开这个问题:JavaScript到底是如何实现继承的? 继承的本质 继承的本质是重用,从语法上来讲,继承就是"D是B"的描述,其中B是基类,描述共性,D是子类,描述特性

Javascript继承机制的实现

学完了Javascript类和对象的创建之后,现在总结一下Javascript继承机制的实现.Javascript并不像Java那样对继承机制有严格明确的定义,它的实现方式正如它的变量的使用方式那样也是十分宽松的,你可以设计自己的方法"模仿"继承机制的实现.有以下几种方法: 1.对象冒充 1 <script type="text/javascript"> 2 function classA(str){ 3 this.str=str; 4 this.pri