- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近在代码中遇到了一个有趣的错误,尽管我设法找到了修复程序,但我想知道是否有人可以解释该解决方案为何有效。这是一些代码
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
implementation和 documentation了解详情。
但是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/
当我在 Django 项目中设置 React 时,我遇到了这个错误 模块构建错误 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js): 语法错误:C
我正在努力使我更漂亮的作品正常工作。当我启动时 format-check ( prettier --check 在 js、ts 文件上)它给了我 SyntaxError: This experimen
当我尝试运行 react js 时出现此错误当前未启用对实验性语法“classProperties”的支持申请。 我正在尝试增加 中的值当我点击一个` 这是关于我的工作的代码片段... impor
我最近在代码中遇到了一个有趣的错误,尽管我设法找到了修复程序,但我想知道是否有人可以解释该解决方案为何有效。这是一些代码 var Project = Backbone.Model.extend({
使用 react-native init MyApp 初始化应用程序时出现以下语法错误 SyntaxError: /Users/MyAccount/RNProjects/app/node_mo
Support for the experimental syntax 'classProperties' isn't currently enabled 我尝试了重新构建后仍然出现错误的解决方案。
我从这个例子中为 Web、Android 和 iOS 构建了一个跨平台的 monorepo 应用程序 https://github.com/brunolemos/react-native-web-mo
我一直收到这个 Support for the experimental syntax 'classProperties' isn't currently enabled 当我为我的 react 应用
好吧,我在尝试在我的 React-native 应用程序上启用 Jest 时遇到了很大的问题。本主题的每个答案都为我的 webpack 或 package.json 提供了不同的配置。我希望能在这里找
我对 React.js 非常陌生。我安装了 Laravel 5.7 并通过运行以下命令将 Vue.js 脚手架替换为 React: php artisan preset react 现在的问题是,我无
我有一个根据本教程设置的 monorepo:tutorial . 该项目由一个包含三个包的主文件夹 (series4) 组成,这三个包专注于 web、移动应用程序和通用代码 - 它们分别命名为 web
我是一名优秀的程序员,十分优秀!