使用管道功能检查对象属性或方法

时间:2014-02-16 13:49:59

标签: javascript object properties object-literal

想象一下这个简单的设置:

var obj = {

    // Extends the object by adding another property or method
    extend: function(key, obj){
        this[key] = obj;
    }

}

现在我可以用它:

obj.extend('panelControl', {
   open: function(){},
   close: function(){}
});

将密钥panelControl添加到工作正常的obj

为了在上面的例子中调用面板控制功能,我会这样做:

obj.panelControl.open();

只要panelControl实际存在/已经设置,它就能正常工作。但如果没有,那么我当然会得到例外。

现在我的想法是创建一个充当管道的函数:

var obj = {

    // Definition of extend function goes here

    // Used to safely access properties or methods with regard to availability
    pipe: function(key){
        if(typeof this[key] !== 'undefined')
           return this[key];
    }

}

所以我打电话给:

obj.pipe('panelControl').open();

只要{/ 1}}已设置,就可以正常工作。

问题是,如果panelControl没有定义,panelControl会给我一个错误:

pipe()

但这正是我试图避免做的事情:

Uncaught TypeError: Cannot call method 'open' of undefined

我研究了这个问题并找到了一些基本上模仿PHP的if(typeof this[key] !== 'undefined') {} 功能的方法:

isset()

或者:

if(key in this) {}

(后者在某些版本的IE中无法使用)

我应用了所有这些但仍然遇到了TypeError。

显然我误解了我所写条件的行为。也许我的做法完全是有缺陷的。也许有更好的方法来做我想要实现的目标。

我怎么能

创建一个函数就像我尝试使用if(this.hasOwnProperty(key)) {} 一样,它传递被调用对象的局部属性,但只有它存在,并取消方法链(即pipe()所以没有例外或发生?

注意:如果有更好的方法可以做到这一点,或许甚至不涉及我打算用obj.pipe('panelControl').open()实现的方法,或者更简单或更安全的方法,请告诉我。

谢谢!

0 个答案:

没有答案