其他一些语言使用存在访问器运算符,例如?.
(请参阅CoffeeScript)
如果您不太担心性能,可以执行以下操作:
function notNull(object:*, properties:String):Boolean
{
if (object == null) return false;
var props:Array = properties.split(".")
for(var i:uint = 0; i < props.length; i++)
{
if(object[props[i]] == null) return false;
object = object[props[i]]
}
return true;
}
然后将其用于:notNull(order, "reference.quote");
但这不是很漂亮,但你可以用一些魔法把它清理一下。Proxy
例如,考虑以下代码:
import flash.utils.Proxy;
import flash.utils.flash_proxy;
dynamic class Existential extends Proxy {
private var _object:*;
public function Existential(object:*) {
_object = object;
}
flash_proxy override function getProperty(name:*):* {
var object:* = _object;
if (object == null) return null;
var props:Array = name.toString().split("$");
for(var i:uint = 0; i < props.length; i++)
{
if(object[props[i]] == null) return null;
object = object[props[i]]
}
return object;
}
}
然后,您可以使用它来包装其他对象并使用$
而不是.
作为临时存在的 getter 来访问它们。
obj = {};
eObj = new Existential(obj);
eObj.what$is$this // null
obj = { what: { "is": { "this": 1 } } } ;
eObj = new Existential(obj);
eObj.what$is$this // 1
但我想性能会很糟糕,我不想将它用于任何性能关键的生产代码。但它可能会给你一些想法。