论坛首页 Web前端技术论坛

测试,探讨jMixin模式

浏览 4775 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-07-08  

继续,仍然是实验目的,意义我自己还没有发现.

看上去就是把new 实例和属性给融合覆盖了.什么地方可以用到这种东西呢?

 

function jMixin(){
	var ths=this;
	var callee=arguments.callee;
	var caller=arguments.callee.caller;
	if (0==arguments.length) {
		var args=[];
		if (caller) ths = caller;
	}else
	if (1==arguments.length){
		var args=arguments[0];
		if (caller) ths = caller;
	}else
	if (2==arguments.length){
		ths=arguments[0];
		var args=arguments[1];
	}
	if (!ths || ths==window) ths={};
	if (!ths.jMixin) ths.jMixin=callee;
	for(var prop in args) {
		if (prop=='prototype') continue;
		ths[prop]=args[prop];
	}
	if (args.prototype) {
		var n = new args;
		for(var prop in n){
			if (prop=='prototype') continue;
			ths[prop]=n[prop];
		}
	}
	return ths;
}
 
0 请登录后投票
   发表时间:2008-11-03  

现在仍然是探索阶段,不过我好像找到一些感觉了.
首贴代码修改了.
我想Mixin模式是适合这样的用途:
1.定义一些独立的对象,这些对象都是完成一些独立的功能
2.这些对象的最终目的是为了通过Mixin成一个有具体目标的对象
3.要细致的规划这些对象的属性,因为这些对象在Mixin的过程中同名的属性会被覆盖掉

这种Mixin的方法有强制培养书写良好对象属性的意思.自己给自己下了一个套.
顺便的这种形式的定义也成为可能

 

var func=inMixin(function(){
  alert('by inMixin');
},{
  foo:22
});

var o1={ddd:333};
var o2=inMixin({},o1,func);//千万不能写成var o2=inMixin(o1,func);这样就是在对o1进行扩展了
 
0 请登录后投票
   发表时间:2009-05-27  

function inMixin(){  
    var ths=this,i=0;  
    if (ths==window){  
        ths=arguments[0];i=1;  
    }  
    if(ths==null) throw "this is undefined";  
    if(i==arguments.length){  
        ths.mixin=inMixin;  
        return ths;  
    }  
    for (;i<arguments.length ;i++){  
        for (var a in arguments[i]){  
            ths[a]=arguments[i][a];  
        }  
    }  
    return ths;  
}  
var func=inMixin(function(){  
  alert('by inMixin');  
},{  
  foo:22  
});  
//func为inMixin生成的新类,
//它的构造函数
alert(func.prototype.constructor)
//它的实例属性
alert(func.foo)
alert("====================")
var _func = new func();
//非常可惜,foo并没有继承下来,并非prototype属性
alert("====================")
alert(_func.foo)
alert("====================")
var class1={method:"I'm a method of class1"};  
var class2=inMixin({},class1,func)
alert(class2.prototype.constructor);
alert(class2.method)
alert("--------------------------------")
var _class2 = new class2();//失败鸟!因为_class2并没有constuctor!
alert("--------------------------------")
alert(_class2.method)//失败了
 
0 请登录后投票
   发表时间:2009-05-27   最后修改:2009-05-27
inMixin()返回并不都是构造函数,应该保证construtor指向自身!
如果成功的话,就有java的接口继承的意义了!
0 请登录后投票
   发表时间:2009-05-28  
司徒正美 写道
inMixin()返回并不都是构造函数,应该保证construtor指向自身!
如果成功的话,就有java的接口继承的意义了!

好像我们讨论的不是一回事呀
inMixin是排斥 new 方法的,纯粹用的扩展
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics