2011-11-23 27 views
1

我想做一个简单的事件处理程序。为什么我的简单事件处理示例不起作用?

(注意,我并不想实现一个全面的发布/订阅模式,我在为什么,因为我认为它应该我的例子不工作只是感兴趣)

var myObj = (function() { 

    var private = "X"; 

    function triggerEvent(eventName) { 
    if (this[eventName]) { 
     this[eventName](); 
    } 
    } 

    // Setter/Getter 
    function getProp() { 
    return private; 
    } 

    function setProp(value) { 
    private = value; 
    triggerEvent("onPropChange"); 
    } 

    // Public API 
    return { 
    // Events 
    "onPropChange": null, // Fires when prop value is changed 

    // Methods 
    "getProp": getProp, 
    "setProp": setProp 
    }; 
})(); 

// Now set event handler 
myObj.onPropChange = function() { 
    alert("You changed the property!"); 
}; 

myObj.setProp("Z"); // --> Nothing happens. Wrong 
        // Why doesn't my alert show? 

我将我的对象的onPropChange属性设置为更简单的处理函数,但不会被解雇。我调试了这个,看起来在triggerEvent变量this正在引用全局window对象。我认为它应该参考myObj(这是我需要的)。

有人可以解释我的想法中的错误,以及我如何纠正这个错误?非常感谢。所以在创建OBJ

jsFiddle here

回答

2

更改您的密码,然后返回它是这样的:

var myObj = (function() { 

    var private = "X"; 
    var obj = { 
    "onPropChange": null, // Fires when prop value is changed 

    // Methods 
    "getProp": getProp, 
    "setProp": setProp 
    }; 

    function triggerEvent(eventName) { 
    if (obj[eventName]) { 
     obj[eventName](); 
    } 
    } 

    // Setter/Getter 
    function getProp() { 
    return private; 
    } 

    function setProp(value) { 
    private = value; 
    triggerEvent("onPropChange"); 
    } 

    return obj;   
})(); 

这样你的私有函数的对象的引用。

固定小提琴 - http://jsfiddle.net/infernalbadger/dkqUW/2/

另一种方式来解决它,你可能更是使用.CALL功能:

function setProp(value) { 
    private = value; 
    triggerEvent.call(this, "onPropChange"); 
} 

这是用来指定this会在被调用的方法(triggerEvent) 。

http://jsfiddle.net/infernalbadger/dkqUW/3/

+0

我已经试过这个了 - 它不起作用。 http://jsfiddle.net/dkqUW/1/也许我是误解。如果你认为它有效,你可以更新我的jsFiddle并添加链接吗? – njr101

+0

我编辑了我的答案,它是错误的:D –

+0

谢谢。这现在起作用。但你能解释为什么我的原稿不起作用吗?我在JS中理解“this”时必须有一个错误。你的解决方案是解决这个问题的“正常”方法吗?我发现它使得代码结构的可读性降低,因为对象需要在代码的一半处进行定义(或者依靠变量提升) – njr101

相关问题