0

我目前正在尝试通过函数添加到对象。

我的代码是:

var ob = {};

function add(f, fun) {
    ob[f] = fun();
}

add('hi', function() {
    alert('hello')
})

ob.hi()​

所以这假设将 ob 更改为:

var ob = {
     hi: function(){
      alert('hello')
     }
}

它确实会发出警报hello,但只是从触发 add 函数(我想停止)而不是从ob.hi()函数中触发。

谢谢你的帮助。如果你愿意,你也可以检查小提琴

4

2 回答 2

2

您正在执行该函数并将其返回值分配给该属性。您需要将对该函数的引用分配给该属性。改变你的add功能:

function add(f, fun) {
    ob[f] = fun; //No invoking parentheses!
}

这是一个更新的小提琴

如果您查看原始小提琴中的控制台,您会发现出现了什么问题:

未捕获的类型错误:对象的属性“hi”#<Object>不是函数

于 2012-07-13T08:01:54.123 回答
1

将您的函数添加为对象的属性:

ob['hi'] = function() {
    alert('hello')
};

或者

ob[funname] = fun;

如果函数在别处定义。

不要add仅仅为了设置属性而编写函数。用自定义设置器替换语言的标准功能不会使代码更具可读性。

并且不要忘记您可以在 javascript 中定义类:

function Rect(x,y,w,h){
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
}

Rect.prototype.contains = function(x, y) {
    return x>=this.x && x<=this.x+this.w && y>=this.y && y<=this.y+this.h;
};

创建的所有对象new Rect(0, 1, 2, 3)都具有该contains功能。

于 2012-07-13T08:02:03.900 回答