gpt4 book ai didi

javascript - 为什么 _.bindAll 阻止您调用 Backbone 模型 classProperty 函数

转载 作者:行者123 更新时间:2023-11-28 02:03:15 26 4
gpt4 key购买 nike

我最近在代码中遇到了一个有趣的错误,尽管我设法找到了修复程序,但我想知道是否有人可以解释该解决方案为何有效。这是一些代码

var Project = Backbone.Model.extend({
initialize: function() {
// Uncomment this line and you will no longer get the alert
//_.bindAll(this);
},
}, {
parse: function() {
alert('Parsing data');
}
});

var project = new Project({});
project.constructor.parse();

我理解bindAll,当这样使用时,会将所有函数绑定(bind)到当前作用域,但我不确定为什么它会影响parse类属性函数。我希望它只会影响实例属性。

最佳答案

我们将关注 1.4.4,因为这是 Underscore 的最后一个版本,无需指定方法名称即可(成功)调用其 _.bindAll

_.bindAll implementation非常简单,回顾一下应该可以弄清楚:

_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
if (funcs.length === 0) funcs = _.functions(obj);
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};

第三行是关键:

funcs = _.functions(obj);

因此,如果您不指定要绑定(bind)的函数,Underscore 将获取对象的所有函数属性并绑定(bind)所有这些属性,请检查 _.functions implementationdocumentation了解详情。

但是constructor属性是什么?嗯,it is :

... a reference to the Object function that created the instance's prototype

这将通过 _.isFunction 测试,因此 constructor 将位于上面的 funcs 数组中。这意味着 constructor 将被 _.bindAll 第四行中的包装函数替换:

obj[f] = _.bind(obj[f], obj);

但是该包装函数不会具有原始 project.constructor 所具有的任何属性(例如 parse),并且一切都会在一堆困惑中分崩离析和废话。

这种困惑可能就是 1.5+ _.bindAll 的原因说:

bindAll _.bindAll(object, *methodNames)

[...] methodNames are required.

如果您尝试迭代对象的属性并尝试找出哪些是函数,哪些不是,您还可能遇到其他奇怪的问题。

<小时/>

我鼓励您在发生意外情况时查看 Underscore 和 Backbone 源代码,它们都相当容易阅读和理解。

关于javascript - 为什么 _.bindAll 阻止您调用 Backbone 模型 classProperty 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18139740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com