`
achun
  • 浏览: 316761 次
  • 性别: 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,作者好似就是在打包,打各种各样的包

相关推荐

    UNIX环境测试探讨-UNIX环境测试

    本文的主要目的是探讨 UNIX 环境下的测试方法和技术,包括白盒测试、黑盒测试、灰盒测试等,并探讨了 UNIX 环境下的大数据量测试。 白盒测试 白盒测试是一种测试方法,即通过检查软件的内部结构和工作机制来检查...

    android平台工厂测试模式

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

    NOKIA手机测试模式参数详解

    NOKIA手机测试模式参数详解,这一主题深入探讨了NOKIA手机的工程模式,即BTS TEST,这是手机制造商为了方便技术维护和故障诊断而设计的一种特殊模式。这一模式包含了丰富的无线参数、GSM系统信息以及手机内部的测试...

    PHP高级程序设计:模式框架与测试

    《PHP高级程序设计:模式框架与测试》是一本深度探讨PHP编程的专业书籍,由人民邮电出版社出版。这本书旨在帮助开发者提升PHP编程技能,掌握更高效、更灵活的开发方式,以及如何进行严谨的测试,确保代码质量和系统...

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

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

    设计模式测试代码

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

    电气自动化控制设备可靠性测试探讨.rar

    本文将深入探讨电气自动化控制设备的可靠性测试,以确保其在实际应用中的高效、安全和稳定。 首先,可靠性测试是为了评估电气自动化控制设备在不同环境条件下的工作性能,包括温度、湿度、振动、电磁兼容性(EMC)...

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

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

    测试平台项目代码-自动化测试

    本项目“测试平台项目代码-自动化测试”聚焦于这一领域,提供了相应的代码实现,让我们来深入探讨其中涉及的关键知识点。 首先,自动化测试主要依赖于测试框架,这些框架提供了一种结构化的方式来编写和执行测试...

    针对敏捷开发的测试模式

    本文将深入探讨一种针对敏捷开发的新型测试模式,并结合实际项目经验进行分析。 #### 二、敏捷开发测试模式概述 敏捷开发测试模式的核心在于能够快速适应需求的变化,提高测试效率和质量。该模式主要包括以下几个...

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

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

    测试架构师修炼之道:从测试工程师到测试架构师1

    在第二部分,作者探讨了测试架构师应该如何思考问题,以及如何培养架构师的思维模式。书中区分了测试经理、系统架构师和测试架构师的不同职责,并详细列出了测试架构师所需的知识能力模型,包括软件产品质量模型、...

    一款安全RISC-V处理器特权模式和内存保护测试.pdf

    【标题】中的主要知识点是关于“一款安全RISC-V处理器”的特权模式和内存保护功能的测试。RISC-V是一种开放源代码的指令集架构(ISA),在嵌入式和物联网领域中逐渐受到关注。特权模式是指处理器在执行不同任务时...

    V2X标准分析及测试方法探讨.zip

    本资料《V2X标准分析及测试方法探讨》将深入剖析V2X的相关标准,并讨论其测试方法。 一、V2X技术标准概述 V2X通信主要基于两种核心技术标准:DSRC( Dedicated Short Range Communications)和C-V2X(Cellular ...

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

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

    USB3.0一致性测试

    本节将探讨几种关键测试码型的选择及其背后的原理。 **2.1 RJ(Random Jitter)测试** - **测试码型**: RJ测试使用CP1周期性测试码型。 - **目的**: RJ测试用于评估信号中的随机抖动,通常源自芯片内部的热噪声或...

    计算机专业测试论文

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

    巧用互联网给力真课堂——探讨互联网模式下初中英语教学策略.pdf

    巧用互联网给力真课堂——探讨互联网模式下初中英语教学策略.pdf

    物联网商业模式探讨.pdf

    由于提供的文件内容大部分是参考文献信息和OCR扫描文本的问题描述,并没有直接提供物联网商业模式的详细探讨内容,所以无法直接从文件内容生成相关知识点。但是,我可以根据“物联网商业模式探讨.pdf”这一标题,...

Global site tag (gtag.js) - Google Analytics