welefen的随笔

Tag Archives: setter

续:JS动态创建类和实例化

IN:前端开发   标签: , ,    评论: 0

之前写过一篇文章是 js动态创建类和实例化, 虽然能够满足很大部分的需求,但在有些方面还有些欠缺。

正好这段时间在写HTML5的游戏,需要写一个只支持HTML5的JS框架,所以把之前的实现方式给完善了下。

创建和实例化方式

(function() {
	var slice = Array.prototype.slice;
	var h5 = function() {
		var cls = function() {
			function T(args) {
				return this.init.apply(this, args);
			}
			var _t = arguments.callee,
				init = _t.prototype.init;
			T.prototype = _t.prototype;
			T.prototype.init = function(){
				var args = arguments;
				if(args.length === 1 && args[0] instanceof _t){
					return this;
				}
				init && init.apply(this, args);
				return this;
			};
			T.constructor = _t;
			return new T(arguments);
		};
		cls.mix = h5.mix;
		cls.gs = h5.gs;
		h5.mix.apply(cls, arguments);
		return h5.gs.call(cls);
	};
	h5.mix = function(){
		var args = arguments, i = 0, target = this.prototype;
		if(typeof args[0] === 'boolean'){
			i = 1;
			target = this;
		}
		slice.call(args, i).forEach(function(item){
			if(typeof item !== 'object') return;
			for(var pro in item){
				target[pro] = item[pro];
			}
		});
		return this;
	};
	/**
	 * getter, setter
	 */
	h5.gs = function(){
		var v, name, tp = this.prototype, uname, gname, sname;
		for(name in tp){
			(function(name){
				v = tp[name];
				if(typeof v !== 'function' && name.substr(0, 1) !== '_'){
					uname = name.substr(0,1).toUpperCase()+name.substr(1);
					gname = 'get'+uname;
					sname = 'set'+uname;
					if(!(gname in tp)){
						tp[gname]= function(){
							return this[name];
						};
					}
					if(!(sname in tp)){
						tp[sname]= function(value){
							return this[name] = value;
						};
					}
				}
			})(name);
		}
		return this;
	};
	this.h5 = h5;
})();

新的方式下命名为h5,即为html5的简写。

继续阅读 »

06-24
2011
loading...