读书人

请教这段js代码是什么意思

发布时间: 2012-11-10 10:48:50 作者: rapoo

请问这段js代码是什么意思

JScript code
Function.prototype.overloadSetter = function(usePlural){        var self = this;        return function(a, b){            if (a == null) return this;            if (usePlural || typeof a != 'string'){                for (var k in a) {                    self.call(this, k, a[k]);                }            } else {                self.call(this, a, b);            }            return this;        };    };    [color=#FF0000]Function.prototype.extend = function(key, value){        this[key] = value;    }.overloadSetter();[/color]    function x() {    }    x.extend('a',1);


这段JS不知道是什么意思,当我执行x.extend('a',1)的时候,为什么
function(a, b)接收到的参数就是a和1呢,麻烦哪位解释一下?谢谢了!

[解决办法]
先看这一句

Function.prototype.extend = function(key, value){
this[key] = value;
}.overloadSetter();

这句相当于

Function.prototype.extend = function(key, value){
function(a, b){
if (a == null) return this;
if (usePlural || typeof a != 'string'){
for (var k in a) {
self.call(this, k, a[k]);
}
} else {
self.call(this, a, b);
}
return this;
};

}

当执行这句x.extend('a',1);时
就会执行这句this[key] = value;
即this.a = 1;



[解决办法]
楼主,我测试了一下。。

并且网上找到
该解释

2.在javascript中有一个Function对象,所有自定义的函数都是Function对象类型的。Function对象接受的所有参数都是字符串类型的,其中最后一个参数就是要执行的函数体,而前面的参数则是函数真正需要接受的参数。

如:

var add = new Function("number","number1","alert(number+number1)");
var add = new Function("number","alert(number+10)");

等价于:

function add(number,number1){

alert(number+number1);

}



function add(number){

alert(number+10);

}

也等价于:

var add =function add(number,number1){

alert(number+number1);

}

var add = function(number){

alert(number+10);

}

所有自定义的函数都是Function类型的实例

Function.prototype.extend = function(key, value){
this[key] = value;
}.overloadSetter();
这句话是对Function类的原型增加定义一个extend函数,该函数是通过一个匿名函数调用overloadSetter方法
所以实际上extend函数实体是(这里之所以能调用overloadSetter方法,同样道理,因为匿名函数的构造函数是Function,也就是Function类的实例化对象,所以匿名函数可以调用该类的方法overloadSetter,该方法的定义就是第一行代码了)
并且其中的self参数是匿名函数: function(key, value){
this[key] = value;
}
function(a, b){
if (a == null) return this;
if (usePlural || typeof a != 'string'){
for (var k in a) {
self.call(this, k, a[k]);
}
} else {
self.call(this, a, b);
}
return this;
};

因此最后x.extend('a',1);表示调用x对象的所属类(Function)的方法extend 也就是上面说过的匿名函数

function(a, b){
if (a == null) return this;
if (usePlural || typeof a != 'string'){
for (var k in a) {
self.call(this, k, a[k]);
}
} else {
self.call(this, a, b);
}
return this;
};
所以这时候的this对象就是x本身了,并且上面说过self是指的匿名函数
function(key, value){
this[key] = value;
}

因此最后调用完成后的结果是对x对象增加一个属性名字为'a',值为1。


[解决办法]
我把最后一部分分解成几个块,相信你会明白


JScript code
<script type="text/javascript">Function.prototype.overloadSetter = function(usePlural) {    var self = this;    return function(a, b) {        if (a == null)            return this;        if (usePlural || typeof a != 'string') {            for ( var k in a) {                self.call(this, k, a[k]);            }        } else {            self.call(this, a, b);        }        return this;    };};var fun2 = function(key, value) {    this[key] = value;};var fun3 = fun2.overloadSetter();alert(fun3);//这才是x.extend('_a', 11)真正调用的函数Function.prototype.extend = fun3;function x() {}<script type="text/javascript">Function.prototype.overloadSetter = function(usePlural) {    var self = this;    return function(a, b) {        if (a == null)            return this;        if (usePlural || typeof a != 'string') {            for ( var k in a) {                self.call(this, k, a[k]);            }        } else {            self.call(this, a, b);        }        return this;    };};var fun2 = function(key, value) {    this[key] = value;};var fun3 = fun2.overloadSetter();alert(fun3);//这才是x.extend('_a', 11)真正调用的函数Function.prototype.extend = fun3;function x() {}var f = x.extend('_a', 11);</script>var f = x.extend('_a', 11);</script>
[解决办法]
探讨
完整的代码是这样的

JScript code
var Function = this.Function;
var enumerables = true;
for (var i in {toString: 1}) {
enumerables = null;
}
if (enumerables) enumerables = ['hasO……

读书人网 >JavaScript

热点推荐