javascript模拟类的最佳实践
1:怎样模拟一个类
在sencha touch2 系列里面定义一个类和new出这个类的对象
Ext.define(
"Animal", {
config: {
name: null
},
constructor: function(config) {
this.initConfig(config);
},
speak: function() {
console.log('说点什么');
}
}
) var my=Ext.create("Animal",{name:"bb"})
my.speak();
上面代码里面constructor在create的时候会自己主动调用。然后初始化config对象配置的属性。
constructor全然就像面对象里面的构造函数……
以下我模拟一下
// 在sencha中new一个对象传了两个參数Ext.create("Animal",{name:"bb"})
// 这里就不模拟sencha的命名空间了,所以生成该类的对象的时候传一个配置对象就可以
// 把命名空间(mss)和命名单独提取出来,new mss.define({});
var mss = {} //建立一个命名空间
mss.define = function(config) {
	if(typeof config !== 'object') {
		console.log('參数错误');
		return;
	}
	var interface = function() { //当new 该define返回的函数。会自己主动运行atrr和init
		this.attr && this.attr();
		this.init && this.init.apply(this, arguments);
	}
	for(var i in config) {
		config.hasOwnProperty(i) &&(interface.prototype[i] = config[i]);
	}
	return interface;
}
var Car = mss.define({
	attr: function() {
		this.type = '汽车';
	},
	init: function() {
		console.log(this.type);
	},
	speank: function() {
		console.log('我是' + this.type);
	}
});
var car1 = new Car();
car1.speank();
输出
汽车
我是汽车
[Finished in 0.1s]
这样就模拟成了:define一个类。然后new出来调用其方法;
2:怎样在此基础上继承一个类
首先看看sencha touch2系列的继承
Ext.define(
"Person", {
extend: "Animal",
speak: function() {
console.log('我是人');
}
}
)
加多一个属性extend搞定。
以下在mss.define模拟一下
// 在sencha中new一个对象传了两个參数Ext.create("Animal",{name:"bb"})
// 这里就不模拟sencha的命名空间了。所以生成该类的对象的时候传一个配置对象就可以
// 把命名空间(mss)和命名单独提取出来,new mss.define({});
var _mss = {} //建立一个命名空间
_mss.Define = function(parClass, curConfig) {
	// 若sup 是个object,表示这是一个新类
	// 若sup 是个function,表示这是一个继承
	if(typeof parClass === 'object') {
		curConfig = parClass;
		parClass = function() {};
	}
	// 定义返回类
	// 当new 该define返回的函数。会自己主动运行atrr和init
	var interface = function() {
		this.attr && this.attr();
		this.init && this.init.apply(this, arguments);
	}
	// 返回类继承 parClass
	interface.prototype = new parClass();
	// 为返回类包括的两个初始化函数定义基础方法
	// 获得继承的init方法 和attr方法
	// 假设parClass存在init方法,那么nterface.prototype.init
	// 和new parClass().init相等
	var parInit = interface.prototype.init || function() {};
	var curInit = curConfig.init || function() {};
	var parAttr = interface.prototype.attr || function() {};
	var curAttr = curConfig.attr || function() {};
	// 为返回类原型初始化当前属性,这里注意可能被后面的方法重写
	for(var i in curConfig) {
		curConfig.hasOwnProperty(i) && (interface.prototype[i] = curConfig[i]);
	}
	// 假设当前返回类已经继承了init,重写该方法
	if(arguments.length && arguments[0].prototype && arguments[0].prototype.init === parInit) {
		interface.prototype.init = function() {
			var scope = this;
			var args = [function() {
				parInit.apply(scope, arguments);
			}];
			var slice = [].slice;
			curInit.apply(scope, args.concat(slice.call(arguments)));
		}
	}
	// 假设当前返回类已经继承了attr,重写attr 或者是首次构造改方法(新类)
	interface.prototype.attr = function() {
		parAttr.call(this);
		curAttr.call(this);
	}
	// 继承父类的成员属性
	for(var i in parClass) {
		parClass.hasOwnProperty(i) && (interface[i] = parClass[i]);
	}
	return interface;
}
var Car = _mss.Define({
	attr: function() {
		this.type = '汽车';
	},
	init: function() {
		console.log(this.type);
	},
	speank: function() {
		console.log('我是' + this.type);
	}
});
var car1 = _mss.Define(Car, {
})
new car1().speank();
输出
汽车
我是汽车
[Finished in 0.1s]
对于call实现继承
	interface.prototype.attr = function() {
		parAttr.call(this);
		curAttr.call(this);
	}
在Chorome控制台打印这段代码就能够解释一下这段代码了
var _Attr = function() {
  this.a = 1;
}
var B = function() {
  this.attr();
};
B.prototype.attr = function(){_Attr.call(this);}
console.log(new B());
VM665:9 B {a: 1}a: 1__proto__: Battr: (){_Attr.call(this);}constructor: () {__proto__: Object
javascript模拟类的最佳实践的更多相关文章
- [原创]Javascript模拟“类”的综合实现方式以及部分细节【截至ES6】
		[原创]Javascript模拟“类”的综合实现方式以及部分细节[截至ES6] 前言 最近几个旧项目里使用的图片编辑插件出现Bug, 经Review 后确定需要在其内外均做些改动,但是头疼的发现部 ... 
- JavaScript best practices JS最佳实践
		JavaScript best practices JS最佳实践 0 简介 最佳实践起初比较棘手,但最终会让你发现这是非常明智之举. 1.合理命名方法及变量名,简洁且可读 var someItem = ... 
- JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档
		作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ... 
- [笔记]《JavaScript高级程序设计》- 最佳实践
		一.可维护性 1 什么是可维护的代码 可理解性--其他人可以接受代码并理解它的意图和一般途径,而无需原开发人员的完整解释. 直观性--代码中的东西一看就能明白,不管其操作过程多么复杂. 可适应性--代 ... 
- JavaScript的技巧和最佳实践
		JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发 (Node.js和Wakanda)等等.JavaScript还 ... 
- JavaScript 最佳实践
		这个文档是基于JavaScript社区众多开发者的意见和经验,在开发JavaScript代码上的最佳实践和首选的方案的明细表.因为这是一个推荐的表而非原则性的方案,经验丰富的开发者可能对下面的表达会有 ... 
- JavaScript Web 应用最佳实践分析
		[编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ... 
- Javascript定义类(class)的三种方法
		将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ... 
- [转]Javascript定义类的三种方法
		作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ... 
随机推荐
- select选中值,传this
			<select onChange = "a(this)"></select> function a(obj){ $(obj).find("opti ... 
- vb常用的内部函数(二):字符串函数
			len(string):计算字符串长度函数.返回字符串string中字符的个数.一个汉字为一个字符,空格也为一个字符,空字符串的长度为0. Ltrim(string).Rtrim(string).Tr ... 
- mven系列问题
			1.前言 Maven,发音是[`meivin],"专家"的意思.它是一个很好的项目管理工具,很早就进入了我的必备工具行列,但是这次为了把 project1项目完全迁移并应用mave ... 
- Bedrock Linux 0.7.3 发布
			Bedrock Linux是一种元分发,允许用户利用其他通常互斥的Linux发行版的功能,并让它们无缝地一起工作.该项目发布了其0.7.x系列,Bedrock Linux 0.7.3的更新. 新的更新 ... 
- LaTeX argmin argmax 下标使用方法
			本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50036001 LaTeX中,使用arg ... 
- chrome默认打开隐身模式
			chrome图标右键属性,在“目标”后添加参数“ --incognito”(注意是双短划线,不包括双引号,双短划线前加一空格)就可以直接以隐身模式启动chrome了 
- android -- 小问题  关于ListView设置了OnScrollListener之后onScrollStateChanged()和onScroll方法监听不到的问题
			关于ListView设置了OnScrollListener之后onScrollStateChanged()和onScroll方法监听不到的问题: 原因: 首先OnScrollListener是焦点滚动 ... 
- cocos2d-x中的二段构造模式
			学习cocos2d-x的过程中,会发现很多对象都通过一个静态函数create来创建.比方以下的一个样例 #define CREATE_FUNC (__TYPE__) \ static __TYPE__ ... 
- 用LogParser分析Windows日志
			用LogParser分析Windows日志 实战案例分享 假设你已具有上面的基础知识,那么以下为你准备了更加深入的应用操作视频(从安装到使用的全程记录): http://www.tudou.com/p ... 
- [HNOI2008] GT考试(DP+矩阵快速幂+KMP)
			题目链接:https://www.luogu.org/problemnew/show/P3193#sub 题目描述 阿申准备报名参加 GT 考试,准考证号为 N 位数 X1,X2…Xn(0 <= ... 
