在某些javascript实现(Rhino,SpiderMonkey)中没有 noSuchMethod 功能。
proxy = {
__noSuchMethod__: function(methodName, args){
return "The " + methodName + " method isn't implemented yet. HINT: I accept cash and beer bribes" ;
},
realMethod: function(){
return "implemented" ;
}
}
js> proxy.realMethod()
implemented
js> proxy.newIPod()
The newIPod method isn't implemented yet. HINT: I accept cash and beer bribes
js>
我想知道,是否有一种方法可以对物业进行类似的处理?我想编写可以在属性和方法上分派的代理类。
更新: ECMAScript6代理现在已得到广泛支持。基本上,如果您不需要支持IE11,则可以使用它们。
代理对象使您可以定义基本操作的自定义行为,例如属性查找,赋值,枚举,函数调用等。
通过在属性访问上实现陷阱,您可以模拟非标准__noSuchMethod__
陷阱的行为:
function enableNoSuchMethod(obj) {
return new Proxy(obj, {
get(target, p) {
if (p in target) {
return target[p];
} else if (typeof target.__noSuchMethod__ == "function") {
return function(...args) {
return target.__noSuchMethod__.call(target, p, args);
};
}
}
});
}
// Example usage:
function Dummy() {
this.ownProp1 = "value1";
return enableNoSuchMethod(this);
}
Dummy.prototype.test = function() {
console.log("Test called");
};
Dummy.prototype.__noSuchMethod__ = function(name, args) {
console.log(`No such method ${name} called with ${args}`);
return;
};
var instance = new Dummy();
console.log(instance.ownProp1);
instance.test();
instance.someName(1, 2);
instance.xyz(3, 4);
instance.doesNotExist("a", "b");
目前只有一件事可以实际完成您想要的事情,但是不幸的是,它并未得到广泛实施:
目前只有 两种有效的 实现方式,在最新的Firefox4beta(自FF3.7预发行版开始出现)和用于服务器端JavaScript的节点代理中,Chrome和Safari当前正在使用该实现,
。
这是一个早期的提案为[ECMAScript中的下一个版本,它是一个API,可让您实现虚拟化的对象(代理),您可分配各种陷阱-callbacks-了在不同情况下执行的,你得到完全控制目前,ECMAScript
3/5中只有主机对象可以执行此操作。
要构建代理对象,您必须使用Proxy.create
方法,因为您对set
and get
陷阱感兴趣,所以我给您提供了一个非常简单的示例:
var p = Proxy.create({
get: function(proxy, name) { // intercepts property access
return 'Hello, '+ name;
},
set: function(proxy, name, value) { // intercepts property assignments
alert(name +'='+ value);
return true;
}
});
alert(p.world); // alerts 'Hello, world'
p.foo = 'bar'; // alerts foo=bar
在这里尝试。
编辑: 代理API不断发展,Proxy.create
为了使用Proxy
构造函数而删除了该方法,请参见以上更新为ES6的代码:
const obj = {};
const p = new Proxy(obj, {
get(target, prop) { // intercepts property access
return 'Hello, '+ prop;
},
set(target, prop, value, receiver) { // intercepts property assignments
console.log(prop +'='+ value);
Reflect.set(target, prop, value, receiver)
return true;
}
});
console.log(p.world);
p.foo = 'bar';
Proxy API太新了,甚至没有在Mozilla开发人员中心上进行记录,但是正如我所说,自Firefox 3.7预发行版以来,已经包含了有效的实现。
该Proxy
对象在全局范围内可用,并且该create
方法可以带有两个参数,一个handler
对象是一个简单的对象,该对象包含名为要实现的陷阱的属性,一个可选proto
参数使您能够指定一个您的代理继承自。
可用的陷阱有:
// TrapName(args) Triggered by
// Fundamental traps
getOwnPropertyDescriptor(name): // Object.getOwnPropertyDescriptor(proxy, name)
getPropertyDescriptor(name): // Object.getPropertyDescriptor(proxy, name) [currently inexistent in ES5]
defineProperty(name, propertyDescriptor): // Object.defineProperty(proxy,name,pd)
getOwnPropertyNames(): // Object.getOwnPropertyNames(proxy)
getPropertyNames(): // Object.getPropertyNames(proxy)
delete(name): // delete proxy.name
enumerate(): // for (name in proxy)
fix(): // Object.{freeze|seal|preventExtensions}(proxy)
// Derived traps
has(name): // name in proxy
hasOwn(name): // ({}).hasOwnProperty.call(proxy, name)
get(receiver, name): // receiver.name
set(receiver, name, val): // receiver.name = val
keys(): // Object.keys(proxy)
问题内容: 我想从数据库中获取一个对象(如果已存在)(基于提供的参数),或者如果不存在则创建它。 Django的(或)做到了。SQLAlchemy中是否有等效的快捷方式? 我目前正在像这样明确地写出来: 问题答案: 基本上就是这样做的方法,没有快捷方式可供使用的AFAIK。 你可以将其概括为:
问题内容: 不幸的是,HTML中没有CDATA。 遗憾的是,因为它非常适合添加包含XML的注释,因此您不必转义<和>,例如: 但是,可以识别CDATA部分,然后将其转换为HTML。例如: 或者它可以使用比CDATA更简单的语法。因为是可扩展的,所以可能有人添加了此功能。也许已经将它埋在里面的某处…有人知道吗? 问题答案: 您可以使用JavaDoc的标签:
有没有办法跳过使用PayPal REST Api的两步确认过程? 我已经成功地使用PayPalREST api实现了标准流程,它将用户带到PayPal网站,在那里他们输入他们的凭据,然后得到带有“继续”选项的订单摘要。“你快完成了。您将在xxxx商店确认付款”。 有没有一种方法可以跳过这一步?这样就不会让用户返回我的网站,在那里他们必须再次查看订单并选择“付款”,而是在PayPal上显示“立即付款
问题内容: 在Swift中,转义的闭包参数用注释。在Objective- C中是否有任何等效项,以便将生成的Swift接口标记为? 问题答案: 是的,但是从您在问题中提出的建议来看是落后的。规则是,除非明确标记,否则Objective-C不可为空的块会 自动 转换为Swift作为函数。 __
问题内容: 在Python中,该函数允许您迭代一系列(索引,值)对。例如: 用Java有什么办法吗? 问题答案: 对于实现接口的集合,您可以调用方法以获取。迭代器(还有其他方法)有两种方法- ,以获得索引;和,以获取值(与其他迭代器一样)。 因此,上述Python的Java等效项可能是: 与Python一样,它输出:
问题内容: 我正在寻找像MySQL中那样的解析函数(有关更多信息,请参阅文档) 解析函数基于一组行来计算合计值。它们与集合函数的不同之处在于,它们为每个组返回多个行。 是否存在? 问题答案: 不,与MSDB,Oracle,PostgreSQL等其他DBMS相比,它是MySQL的主要不足之一。 我强烈怀疑将来是否会看到MySQL中的窗口函数,尤其是在Oracle收购MySQL之后。 更新04/201