想象一下这个简单的设置:
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()
实现的方法,或者更简单或更安全的方法,请告诉我。
谢谢!