- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的问题的措辞一定是错误的,因为我找不到关于似乎经常出现的问题的现有问题。
我有一个类Foo
。
var Foo = function () {
return {
a: function () {}
};
};
我有另一个类 Bar
,它是用 Foo
的实例实例化的:
var Bar = function (foo) {
// Does something with foo.
};
我想扩展 Foo
实例,以便以不同的方式为 Bar
工作:
var Bar = function (foo) {
foo.a = function () {
return foo.a.apply(this, arguments);
};
// Does something with foo.
};
按照我的方式执行,将导致RangeError:超出最大调用堆栈大小
。有没有办法在没有临时变量的情况下扩展方法本身?
这是使用额外变量来完成此操作的方法:
var Bar = function (foo) {
var originala;
originala = foo.a;
foo.a = function () {
return originala.apply(this, arguments);
};
// Does something with foo.
};
最佳答案
问题:
您超出了最大调用堆栈,因为您一遍又一遍地从自身调用同一函数(递归地)。
原因:
当您构造 Foo
时,它会获得一个分配给其属性 a
的函数。一切都很好。
接下来,您构造 Bar
并尝试通过用您自己的函数替换对象上的函数来修改 Foo.a
的行为。但是,您希望在新函数体内,Foo.a
仍将包含原始函数。事实恰恰相反 - Foo.a
现在包含修改后的新函数。这就是为什么当你调用它时,它会不断调用自己,直到你点击maximum stack size limit。 .
发生这种情况是因为变量的值在执行时解析,并且您的新函数在分配给 Foo.a
后很好地执行。该对象失去了原有的功能。
解决方案:
使用prototypes 。我不会详细介绍如何使用原型(prototype)继承,因为有很多相关内容。
Note that your approach is a valid one, and frequently the only one. You simply need to keep a reference to the original function somewhere so that you can call it at a later time.
关于javascript - 如何在没有临时变量的情况下扩展方法(猴子补丁)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28150415/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我尝试过sp_helpindex,但它显示的是具有索引的列,而不是包含的列。请告诉我如何列出包含列(非键)的所有索引? 最佳答案 针对目录 View 尝试此 T-SQL 查询: SELECT
我是一名优秀的程序员,十分优秀!