我是 JavaScript 新手,对鸭子类型的概念有点困惑。据我所知,我理解了这个概念。但这在我的想法中导致了一个奇怪的结果。我将用下面的例子来解释:
我目前正在使用 jQuery Mobile 开发移动 Web 应用程序。有一次我捕捉到了vmousedown
画布事件。我对触摸的压力很感兴趣。我找到了Touch.webkitForce
财产。
$('#canvas').live('vmousedown', function(e){
console.log(e.originalEvent.originalEvent.touches[0].webkitForce);
}
使用时效果很好远程调试对于 Chrome。但在 Opera Firefly 中测试时会抛出异常,因为originalEvent
属性不是触摸事件,而是点击事件。
因此,每次我访问不在我权限范围内的对象的属性时,我是否必须检查其存在性和类型?
if( e.originalEvent &&
e.originalEvent.originalEvent &&
e.originalEvent.originalEvent.touches &&
e.originalEvent.originalEvent.touches[0] &&
e.originalEvent.originalEvent.touches[0].webkitForce) {
console.log(e.originalEvent.originalEvent.touches[0].webkitForce);
}
有人可以帮我澄清一下吗?
因此,每次我访问不在我权限范围内的对象的属性时,我是否必须检查其存在性和类型?
是的,您必须一次检查整个路径,或者您可以将其自动化:
function deepObject(o, s) {
var ss = s.split(".");
while( o && ss.length ) {
o = o[ss.shift()];
}
return o;
}
var isOk = deepObject(e, "originalEvent.originalEvent.touches.0.webkitForce");
if ( isOk ) {
// isOk is e.originalEvent.originalEvent.touches.0.webkitForce;
}
测试用例:
var o = {
a: {
b: {
c: {
d: {
e: {
}
}
}
}
}
}
var a = deepObject(o, "a.b.c");
var b = deepObject(a, "d");
console.log(a); // {"d": {"e": {}}}
console.log(b); // {"e": {}}
console.log(deepObject(o, "1.2.3.3")); // undefined
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)