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

相关推荐

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

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

    敏捷开发模式下测试策略

    敏捷开发模式下的测试策略是现代软件开发中的一种关键实践,旨在快速响应市场变化,提高产品质量和团队效率。这种模式强调灵活、迭代的工作方式,测试在其中扮演着至关重要的角色。 一、过程管理角色 在敏捷环境中...

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

    《PHP高级程序设计:模式、框架与测试》是一本深入探讨PHP编程的专著,旨在提升读者在PHP领域的专业技能,特别是在模式应用、框架选择与使用以及软件测试方面的能力。这本书详细介绍了如何利用PHP进行高效、可靠且可...

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

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

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

    在深入探讨“电气自动化控制设备可靠性测试”这一主题之前,首先需要了解电气自动化控制设备的基本概念。电气自动化控制设备是指在工业生产和管理过程中,利用电子技术、计算机技术以及自动控制理论等先进技术,实现...

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

    ### 《机械工程测试技术》研究型教学模式改革探讨 #### 摘要与背景 本文探讨了《机械工程测试技术基础》这门课程的研究型教学模式改革问题。该课程作为机械工程专业的重要组成部分,旨在使学生掌握机械工程测试...

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

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

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

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

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

    【测试架构师修炼之道:从测试工程师到测试架构师1】这本书主要探讨了软件测试工程师如何进行职业规划,以及如何成长为一名优秀的测试架构师。书中通过两个面试故事引入了核心议题,即测试的核心并不仅限于业务知识...

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

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

    物联网商业模式探讨.docx

    物联网商业模式探讨 本文探讨了物联网商业模式的概念、分类、关键要素和创新方向,并通过案例分析来具体阐述物联网商业模式的应用和实践。物联网商业模式是指企业通过将物联网技术应用于商业模式中,实现生产效率的...

    焊接专业信息化教学模式探讨.docx

    【焊接专业信息化教学模式探讨】 焊接专业作为职业教育的重要组成部分,面临着如何在信息化时代提升教学质量的挑战。信息化教学模式,正是适应这一时代趋势的创新教学方式,旨在通过利用现代信息技术手段,改进传统...

    LTE系统核心技术剖析及eNodeB测试方案探讨

    ### LTE系统核心技术剖析及eNodeB测试方案探讨 #### 一、引言 随着移动通信技术的不断发展,UMTS(Universal Mobile Telecommunications System)系统虽然能够满足用户的基本数据业务需求,但在宽带接入技术如Wi-...

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

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

    多模式匹配算法实现及测试代码

    本文将深入探讨两种经典的多模式匹配算法:Aho-Corasick (AC) 算法和 Wu-Manber (WM) 算法,并提供相关的实现及测试代码。 首先,我们来了解**Aho-Corasick (AC) 算法**。AC算法是在1975年由Aho、Corasick两位科学...

    基于MVC设计模式的SaaS云计算数据中心构建与鲁棒性测试模式探究.pdf

    本研究探讨了如何利用MVC设计模式对SaaS云计算数据中心进行构建,并提出了新的鲁棒性测试范式。新的测试范式不仅仅局限于传统的功能测试,还包括了性能测试、压力测试和安全测试等多方面的考虑。性能测试主要是评估...

    物联网商业模式探讨.pdf

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

Global site tag (gtag.js) - Google Analytics