`
achun
  • 浏览: 314207 次
  • 性别: Icon_minigender_1
  • 来自: 河南郑州
社区版块
存档分类
最新评论

测试,探讨jMixin模式

阅读更多

修正后的Mixin

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;
}

 需要说明的是Mixin模式是完全不同于prototype的,甚至是天生排斥原型定义方法的,我很难说清楚我为什么要这样干.

还是那句话:测试,探讨

===============下面是最初的文章==========================

首先,我自己都不知道自己想要什么结果,测试了之后才知道有没有价值.

var jMixin = function(){
	if (arguments.length>2) return;
	var ths=this;
	var callee=arguments.callee;
	var caller=arguments.callee.caller;
	if (arguments.length==0) {
		ths.jMixin=callee;
		return;
	}
	if (arguments.length==1){
		var args=arguments[0];
		if (caller!==null) ths = caller;
	}else{
		ths=arguments[0];
		var args=arguments[1];
	}
	if (ths==window || ths==undefined) ths={};
	if (arguments.length==1 && caller==null)
		ths.jMixin=callee;
	for(var prop in args) ths[prop]=args[prop];
	return ths;
}
var o=jMixin();
jMixin(o,{c:2});
var oo=jMixin({o:1});
jMixin(oo,{c:2});
var o2=jMixin(o);
var foo={};
jMixin(foo,{c:2});

var foonewnone=new jMixin();
var foonew=new jMixin(o);
var foonew2=new foonew.jMixin({c:5});
 
分享到:
评论
14 楼 achun 2009-05-28  
司徒正美 写道
inMixin()返回并不都是构造函数,应该保证construtor指向自身!
如果成功的话,就有java的接口继承的意义了!

好像我们讨论的不是一回事呀
inMixin是排斥 new 方法的,纯粹用的扩展
13 楼 司徒正美 2009-05-27  
inMixin()返回并不都是构造函数,应该保证construtor指向自身!
如果成功的话,就有java的接口继承的意义了!
12 楼 司徒正美 2009-05-27  
<p>
</p>
<pre name="code" class="js">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&lt;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)//失败了</pre>
 
11 楼 achun 2008-11-03  
<p>现在仍然是探索阶段,不过我好像找到一些感觉了.<br/>首贴代码修改了.<br/>我想Mixin模式是适合这样的用途:<br/>1.定义一些独立的对象,这些对象都是完成一些独立的功能<br/>2.这些对象的最终目的是为了通过Mixin成一个有具体目标的对象<br/>3.要细致的规划这些对象的属性,因为这些对象在Mixin的过程中同名的属性会被覆盖掉<br/><br/>这种Mixin的方法有强制培养书写良好对象属性的意思.自己给自己下了一个套.<br/>顺便的这种形式的定义也成为可能</p>
<p> </p>
<pre name='code' class='js'>var func=inMixin(function(){
  alert('by inMixin');
},{
  foo:22
});

var o1={ddd:333};
var o2=inMixin({},o1,func);//千万不能写成var o2=inMixin(o1,func);这样就是在对o1进行扩展了</pre>
 
10 楼 achun 2008-07-08  
<p>继续,仍然是实验目的,意义我自己还没有发现.</p>
<p>看上去就是把new 实例和属性给融合覆盖了.什么地方可以用到这种东西呢?</p>
<p> </p>
<pre name='code' class='js'>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;
}</pre>
 
9 楼 csf178 2008-07-07  
hax 写道
csf178 写道
试图把模式封装成类是很多OO的初学者常犯的错误
就好像在Java中写一个DesignPatterns包一样 呵呵
遗憾的是 JS中 很多"知名框架"也在犯这个错误 这导致了更多的新手被误导
像prototype.js中的Class就是很明显的例子

我也只是提醒楼主一下 希望你能设计的角度去思考一下 应该如何实现你想要的东西


Class继承得到普遍的接受,这是毋庸置疑的。有诸多的js中的class继承实现,也说明了开发者的需要。不仅“知名框架”几乎都干这个事情,ES4也加入了Class。所以尽管有一小撮人坚信js可以不需要class继承(请勿怀疑其实偶也是这一小撮人之一),但是历史车轮是无法阻挡的。

错误不在class继承 也不在于将class继承在JS中实现 而在于将class继承封装为XX
8 楼 afcn0 2008-07-06  
js不需要class,但是大规模编程好似不能没有class,class的包装始终比原型动态this后绑定清晰
7 楼 hax 2008-07-06  
csf178 写道
试图把模式封装成类是很多OO的初学者常犯的错误
就好像在Java中写一个DesignPatterns包一样 呵呵
遗憾的是 JS中 很多"知名框架"也在犯这个错误 这导致了更多的新手被误导
像prototype.js中的Class就是很明显的例子

我也只是提醒楼主一下 希望你能设计的角度去思考一下 应该如何实现你想要的东西


Class继承得到普遍的接受,这是毋庸置疑的。有诸多的js中的class继承实现,也说明了开发者的需要。不仅“知名框架”几乎都干这个事情,ES4也加入了Class。所以尽管有一小撮人坚信js可以不需要class继承(请勿怀疑其实偶也是这一小撮人之一),但是历史车轮是无法阻挡的。
6 楼 achun 2008-07-06  
csf178 写道
试图把模式封装成类是很多OO的初学者常犯的错误
就好像在Java中写一个DesignPatterns包一样 呵呵
遗憾的是 JS中 很多"知名框架"也在犯这个错误 这导致了更多的新手被误导
像prototype.js中的Class就是很明显的例子

我也只是提醒楼主一下 希望你能设计的角度去思考一下 应该如何实现你想要的东西

我就是对这个模糊才自己做试验的,你这一提醒,我倒是要思考一下了。
能给几个这方面对比,批判的文章地址么?
5 楼 csf178 2008-07-06  
试图把模式封装成类是很多OO的初学者常犯的错误
就好像在Java中写一个DesignPatterns包一样 呵呵
遗憾的是 JS中 很多"知名框架"也在犯这个错误 这导致了更多的新手被误导
像prototype.js中的Class就是很明显的例子

我也只是提醒楼主一下 希望你能设计的角度去思考一下 应该如何实现你想要的东西
4 楼 achun 2008-07-06  
csf178 写道
窃以为无需把各种语言炒作的概念弄到JS里做个实现

话是不错。可JS中这个很常见呀就是扩展的另一种形式和实现
csf178 写道

而且 不要试图把模式封装成函数或者类

貌似大家都是这么干的。
我也仅仅尝试一下,有没有意义自己也没谱
3 楼 csf178 2008-07-06  
窃以为无需把各种语言炒作的概念弄到JS里做个实现
而且 不要试图把模式封装成函数或者类
2 楼 achun 2008-07-05  
我就是那个作者呀,打包?明明是混入(mixin)呀
1 楼 afcn0 2008-07-05  
大概就是一个参数不传递,什么也不做
传递一个参数,当作args,如果有caller存在,把ths弄到caller再吧args里面参数弄到ths,如果没有caller,直接弄个空对象,把args弄到里面
2个参数,ths就是第一参数对象,把第二参数对象当作args,再吧args弄到ths里
带参数的调用都最后吧ths这个对象反回去
其中还有只有一参数时,如果没有caller还要在这个对象里面弄个jMixin,作者好似就是在打包,打各种各样的包

相关推荐

    android平台工厂测试模式

    下面我们将详细探讨工厂测试模式的相关知识点。 1. **开启工厂测试模式** - 开启工厂测试模式的方法因设备而异,一般通过在启动时输入特定的代码(如`*#*#7378423#*#*`)或者在设置中寻找隐藏的入口。 - 在代码...

    软件测试-基于问题驱动模式(朱少民)

    课程会探讨如何运用自动化工具进行问题驱动的测试,以及如何构建持续集成环境,以实现快速反馈和高效迭代。 六、性能与安全性测试 课程还将涉及性能测试和安全性测试的相关内容,讲解如何根据软件的实际运行情况,...

    问题探讨教学模式实施总结.doc

    【问题探讨教学模式实施总结】 问题探讨教学模式是基于现代教育理念的一种教学方式,强调以问题为导向,激发学生主动思考和探究。这种模式源于美国心理学家布鲁钠的理论,他认为教育的目标不仅是传授知识,更是培养...

    《PHP高级程序设计_模式、框架与测试》中文版PDF

    《PHP高级程序设计_模式、框架与测试》中文版PDF 本书采用循序渐进的方式介绍了用php进行web开发的相关知识。书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂...

    设计模式测试代码

    这里提到的"设计模式测试代码"着重于两个经典的设计模式:命令模式(Command)和观察者模式(Observer)。接下来,我们将深入探讨这两个设计模式的概念、应用场景及其实现细节。 **命令模式** 命令模式是一种行为...

    PHP高级程序设计_模式、框架与测试 pdf

    《PHP高级程序设计_模式、框架与测试》是一本深入探讨PHP编程的书籍,主要涵盖了三个核心主题:设计模式、开发框架以及软件测试。这些内容对于提升PHP开发者的专业技能和项目实施能力至关重要。 首先,设计模式是...

    云计算下的软件测试系统探讨.pdf

    云计算下的软件测试系统涉及的技术和概念十分丰富,主要探讨了在传统软件测试过程中出现的高成本、低效率的问题,并提出云计算作为一种可行的解决方案。接下来将对云计算下的软件测试系统进行详细的知识点探讨。 ...

    某半导体电子厂无尘室系统测试探讨.pdf

    某半导体电子厂无尘室系统测试探讨.pdf

    5G智慧医疗院前急救模式探讨.pdf

    "5G智慧医疗院前急救模式探讨" 本文讨论了5G智慧医疗院前急救模式的重要性和实施可能性。院前急救是严重创伤救治体系的重要组成部分,但是现有的院前急救模式存在一些问题,如模式多样、急救信息难以实现实时共享等...

    智慧社区产品及运营模式探讨

    智慧社区产品及运营模式探讨,智慧社区是智慧城市的重要组成部分。

    STM32单片机低功耗模式测试代码

    总之,通过STM32单片机的低功耗模式测试,不仅可以深入了解其功耗管理特性,还能为实际应用提供优化策略,比如在电池供电的便携设备中,合理利用低功耗模式可以显著延长设备的工作时间。通过实验和分析,我们可以更...

    教学模式:中职计算机应用基础教学模式探讨.pdf

    "教学模式:中职计算机应用基础教学模式探讨" 本文探讨中职计算机应用基础教学模式,旨在探索如何让学生具备实践能力,满足社会需求。计算机应用已经渗透到各个行业,成为各个行业的核心竞争力。因此,中职计算机...

    基于大数据背景下跨境电商(B2C模式)的探讨与分析.pdf

    基于大数据背景下跨境电商(B2C模式)的探讨与分析.pdf

    “互联网 ”的客户侧分布式储能P2P共享模式运营机制及效益探讨.pdf

    文章探讨了“互联网+”在客户侧分布式储能领域中引入P2P共享模式的运营机制及其效益,提出了一种新的运营服务模型。此模型基于共享思想,允许用户分享闲置的储能资源以获得收益。由于客户侧储能目前面临高成本、技术...

    《机械工程测试技术》研究型教学模式改革探讨.docx

    《机械工程测试技术》的研究型教学模式改革旨在解决传统教学中存在的问题,提升教学质量和学生综合素质。在传统教学模式中,教学方式单一,主要依赖教师课堂讲授,学生参与度低,导致学生对知识的应用理解不足。此外...

    企业经营的商业模式探讨-Hosonic.pdf

    此外,本文还探讨了利润模式的七大分类,即巨量模式、价值链模式、消费者模式、通路模式、产品模式、知识模式及组织模式等。每一个模式又可以再分成几种次模式,在不同的时空及产业下,企业应不断的创造价值及采取更...

    计算机专业测试论文

    此外,论文可能还会涉及敏捷开发中的测试实践,比如持续集成(CI)和持续部署(CD),以及TDD(测试驱动开发)和BDD(行为驱动开发)等测试先行的开发模式。这些方法强调将测试融入到整个开发流程中,从而尽早发现...

Global site tag (gtag.js) - Google Analytics