手机版

JQuery从另一个角度动态扩展对象

时间:2021-10-23 来源:互联网 编辑:宝哥软件园 浏览:

比如有一个employee对象,复制代码如下:函数employee () {this。e _ id=0;this.e _ name=}现在需要动态添加‘age’属性和‘toString()’方法,复制代码如下: var empObj=new employee();empObj[' age ']=20;empObj[' ToString ']=function(){ return this . e _ id . ToString(). this . e _ name;};一行简单的代码承担了这项工作,这是Javascript所支持的,但往往我们需要在此基础上支持一定程度的扩展,所以我们将这一行简单的代码提取成一个方法:复制代码如下:函数dym _ setprop (obj,key,value){ if(obj key){ obj[key]=value;}}看到这里,我们跳转到C#中的employee对象,如下所示:

在面向对象编程中,所有的属性(Get/Set)都是外部使用的,所以要考虑如何将这个方法检入Javascript。现在让我们跳回dym _ Setprop函数。在dym_setprop方法中,我们不能使用obj[key]=value的直接赋值方法,而是支持set。复制代码如下:函数dym _ setprop (obj,key,value,fn) {if (obj key) {fn (obj,key,value);}}参数fn,如果不直接操作dym_Setprop中的任何对象,而使用函数fn代替相应的操作码,除了支持set之外,还会有充足的自由空间。让我们进一步探讨dym_setprop方法。现在我们关注参数值。每个人都知道值可以是值类型,也可以是函数。对于值类型来说,不考虑其他东西直接赋值就可以了,但是对于函数来说,就没那么简单了。它支持两种操作:1。将函数直接分配给新扩展的属性;2.将函数执行的返回值赋给新扩展的属性。复制代码如下: Function Dym _ setprop (obj,key,value,fn,exec,pass){ if(objkey){ var temp=value;if (exec) { temp=value.call(obj,key,fn(obj,key));} fn(obj、key、temp、pass);}}在这段代码中,parameter exec充当上述两个操作的选择,而parameter pass是一个附加的执行参数。另外,你可能对fn有些怀疑,因为上面有两个地方,唯一的区别就是参数的个数。fn代表什么?再想想C#中的属性,它有Get/Set,所以这里fn(obj,key)相当于Get,而fn(obj,key,temp,pass)相当于Set。例如,看看下面的代码。对于fn的定义和使用,复制代码如下:Employee。accessprop=function (obj,key,value){ if(value){ obj[key]=value;} else { return obj[key];} } dym_setprop(empObj,‘age’,function(key,value) {返回值10;},员工。AccessProp,true);看了这么多,大家可能会觉得压抑。为什么一个简单的动态扩展对象程序要这样写?有种没事找事的感觉。其实如果你只想做一个动态扩展对象,我建议你不要采用dym_setprop的上述思路,但是如果你想从更抽象的角度去思考,就把dym_setprop中的程序作为流程执行的模板。这是一个很好的方法,因为dym_setprop不承担任何特定代码(obj[key]=value或obj[key])的执行,而是由函数fn代替,所以有完全自由的空间用于特定的执行。了解了以上思想之后,让我们进入本文的核心,JQuery是如何实现对象的动态扩展的?访问函数,复制代码如下:函数访问(elems,key,value,exec,fn,pass){ var length=elems . length;//设置多个属性if(type of key==' object '){ for(var k in key){ access(elems,k,key[k],exec,fn,value);}返回elems} //设置一个属性if(值!==未定义){ //可选地,如果exec为true exec=!传递exec jQuery.isFunction(值);for(var I=0;一、长度;i ) { fn(elems[i],key,exec?value.call(elems[i],I,fn(elems[i],key ) ) :值,pass);}返回elems} //获取属性返回长度?fn(elems[0],键): null}仔细阅读access函数的代码后,一定会发现它与dym_setprop的兼容性很高,但它只有一个额外的代码:复制的代码如下: if(key的类型=' object '){ for(var k in key){ access(elems,k,key [k],exec,fn,value);}返回elems}很容易看出它实际上是用来支持对象对象的动态扩展属性的。具体实现过程如下图所示:

现在写完了,本文试着从我自己的角度来猜测JQuery的开发者是如何设计访问函数来支持动态扩展对象的,并说明访问的执行流程。其实我的猜测不一定正确,但并不妨碍我对JQuery的研究。

版权声明:JQuery从另一个角度动态扩展对象是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。