此方法并非笔者原创,笔者只是在前辈的基础上,加以总结,得出一种简洁实用的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简洁继承机制实现(不使用prototype和new)的更多相关文章
-
Javascript类继承-机制-代码Demo【原创】
最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...
-
JavaScript中继承机制的模仿实现
首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ...
-
深入了解JavaScript中基于原型(prototype)的继承机制
原型 前言 继承是面向对象编程中相当重要的一个概念,它对帮助代码复用起到了很大的作用. 正文 Brendan Eich在创建JavaScript时,没有选择当时最流行的类继承机制,而是借鉴Self,用 ...
-
JavaScript 原型与继承机制详解
引言 初识 JavaScript 对象的时候,我以为 JS 是没有继承这种说法的,虽说 JS 是一门面向对象语言,可是面向对象的一些特性在 JS 中并不存在(比如多态,不过严格来说也没有继承).这就困 ...
-
JavaScript大杂烩4 - 理解JavaScript对象的继承机制
JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...
-
javascript深度克隆与javascript的继承实现
1.javascript深度克隆: //注意这里的对象包括object和array function cloneObject(obj){ var o = obj.constructor === Arr ...
-
javascript 之 prototype继承机制
理解Javascript语言的继承机制 javascript没有"子类"和"父类"的概念,也没有"类"(class)和"实例&qu ...
-
Javascript prototype 及 继承机制的设计思想
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
-
javascript继承机制 &; call apply使用说明
一.继承机制 1.对象冒充:构造函数使用 this 关键字给所有属性和方法赋值,可使 ClassA 构造函数成为 ClassB 的方法,然后调用它. function ClassZ() { this. ...
随机推荐
-
Windows Azure 生成证书
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64>makecert -sky exchange -r -n &qu ...
-
POJ 3185	The Water Bowls (高斯消元 求最小步数)
题目链接 题意:有20个数字,0或1.如果改变一个数的状态,它左右两边的两个数的状态也会变反.问从目标状态到全0,至少需要多少次操作. 分析: 和上一题差不多,但是比上一题还简单,不多说了,但是在做题 ...
-
Ubuntu16.04下编译vim with python support失败的原因
- youcompleteme原话:On Ubuntu 16.04, Python support was not working due to enabling both Python2 and P ...
-
vs2013 cpu占用100%问题
是由于显卡驱动支持wpf有问题 更新驱动或设置里取消自动调节视觉效果 http://support.microsoft.com/kb/2894215
-
android EditText与TextView几个常用的属性
android:maxLength="100"输入框最多输入的字数. android:maxEms="10"每行最多输入字符个数 android:textcol ...
-
canvas常用api
1. 在canvas标签中给出长宽(不带单位):<canvas width="600" height="600"></canvas> 或 ...
-
Netbeans简要配置许可证信息
<#if licenseFirst??>${licenseFirst}</#if>${licensePrefix}Copyright (C) <2017> < ...
-
web开发性能优化---分布式篇
1.分布式架构-独立站点开发 模块化结构化开发,实现多资源分站点,数据分库,为后期实现分布式部署做准备,主要分为以下几部分: web站点: 1.web前端站点 2.图片.文件资源站点 3.管理端站点4 ...
-
JVM学习记录-类加载的过程
类的整个生命周期的7个阶段是:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Us ...
-
Octoroit OS VB操作系统简单介绍
官方地址:http://octoroit.weebly.com/ 首先需要指明的是 :Octoroit OS 并不是一个真正意义上的操作系统,它是运行在windows 之上的 窗口系统,一个Visua ...