2008年9月16日星期二

JavaScript也够魔幻的

可支持按如下方式使用,而且这几个方法不是在一个函数实现中判断arguments.length来走不同分支的,而是可以动态添加方法的——当然,由于JavaScript不是静态类型语言,只能根据参数个数来决定走那个实现,不能根据参数类型
var users = new Users();
users.find(); // Finds all
users.find("John"); // Finds users by name
users.find("John", "Resig"); // Finds users by first and last name
users.find("John", "E", "Resig");
作者说的private members,其实只是在constructor中声明的变量和函数,没有挂到this后面,根据JavaScript的闭包原则,constructor中声明的函数是可以访问这些private变量和函数的,但在constructor之外(比如通过classFoo.prototype.funcB = function(...) {...}创建的方法)的就无法访问这些东西了。所以作者称constructor里面通过this.funcA = function(...) {...}方式添加的成员函数为priviliged method.
  • 属性名一定要满足标识符规定么?
今天一个兄弟项目组的同事碰到一个问题,让我帮忙看看。他在Firebug中看到一个params对象有如下一些属性显示了出来(大致如此)
params
filter[0][data][type]="string"
filter[0][data][value]=2
filter[0][type]="field"
start=0
limit=20
然后他想去取有多少个filter,然后逐一处理。但访问params.filter时出错,访问params.filter[0]时也出错。但上面连数组内各个值都显示出来了啊。

我开始也觉得不可能,但看了一阵,觉得Filebug的显示比较奇怪,为什么它不把filter作为一个成员,再在下面显示数组内容呢? 然后我用for (e in params) { alter(e) }试了一下,发现它有属性就叫做"
filter[0][data][type]"!

这是怎么设进去的呢?
以前看文章说JavaScript中foo.bar=1和foo["bar"]=1是等价的, 当然现在不经过params.filter[0]就直接设置params.filter[0][data][type]="string"是不行的,所以估计是这种方式: params["filter[0][data][type]"]="string"——不过也说明了这两种不是等价的。至于为什么要这么写,据后来另外一个同事说PHP里面可以直接用上这样的数据(我是不懂)。

没有评论: