我想将一些函数调用从一个对象委托给另一个对象:
objA.feature = objA.component.feature;
(假设feature
应该是objA及其组件中的函数)
但这显然不起作用,因为this
的引用从函数中被剥离,并且在被调用时最终成为一个完全不同的对象(它实际上是objA
而不是{{ 1}})。
你需要写这样的东西才能让它发挥作用:
objB.component
是否有更短(惯用)的方法呢?
答案 0 :(得分:5)
在较新的运行时中,函数原型上有一个名为"bind"的函数:
var newFunc = someFunc.bind(somethingThatShouldBeThis);
当调用“newFunc”时,会使this
引用“somethingThatShouldBeThis”。
您可以从Functional库中窃取代码,以便在缺少本地代码的环境中提供“绑定”功能。
编辑 - 这是功能代码:
Function.prototype.bind = function(object/*, args...*/) {
var fn = this;
var args = Array.slice(arguments, 1);
return function() {
return fn.apply(object, args.concat(Array.slice(arguments, 0)));
}
}
很简单,嗯?它只返回一个函数,在调用时,它将第一个参数作为函数调用,并传递你传入的任何参数到结果(也就是上面例子中的“newFunc”)。主要的皱纹是,这个还可以节省原来传递的额外参数,这有时可以很方便。
答案 1 :(得分:1)
以下是关于范围的精彩文章:
但是,大多数JavaScript框架(MooTools,jQuery)都内置了这种方法。 jQuery使用“代理”而MooTools使用“绑定”,所以一定要查看你正在使用的任何框架的文档。
答案 2 :(得分:0)
最好的办法是使用像某些框架一样的createDelegate风格的方法。几年前OdeToCode发布了一个简单的实现。