您的位置:首页 > Web前端 > JQuery

JQuery另类视角-动态扩展对象

2010-05-24 22:20 260 查看
  大家都知道javascript是动态语言,它对动态的支持是与身俱来的。

  例如:有一个employee对象,

function 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内置支持的,不过往往我们需要在这基础上支持一定程度的扩展,所以会将这一行简单的代码抽成一个方法:

function dym_setprop(obj, key, value) {
if (obj && key) {
obj[key] = value;
}
}
  看到这里,我们先让思路做个跳转,跳到C#中的employee对象,如下:

access函数

function access( elems, key, value, exec, fn, pass ) {
var length = elems.length;

// Setting many attributes
if ( typeof key === "object" ) {
for ( var k in key ) {
access( elems, k, key[k], exec, fn, value );
}
return elems;
}

// Setting one attribute
if ( value !== undefined ) {
// Optionally, function values get executed if exec is true
exec = !pass && exec && jQuery.isFunction(value);

for ( var i = 0; i < length; i++ ) {
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
}

return elems;
}

// Getting an attribute
return length ? fn( elems[0], key ) : null;
}
  仔细看完access函数的代码,你一定发现它和dym_setprop的相试度很高,它只是多了一段代码:

if ( typeof key === "object" ) {
for ( var k in key ) {
access( elems, k, key[k], exec, fn, value );
}
return elems;
}
很容易看出它其实就是用来支持object对象的动态扩展属性。具体的执行流程通过下图来展示:



   到这里已经写完了,本文试着从自己的角度上去猜测JQuery的开发者是如何设计出access函数的,让它去支持动态扩展对象,并且说明了access的执行流程。其实对于我的这种猜测不一定正确,不过不妨碍我对于JQuery的研究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: