JavaScript(Underscore.js)扩展功能
JavaScript (Underscore.js) Extending functionality
免责声明:(1)我的后台是Java/C#,我上周才开始深入研究JavaScript。(2) 我知道_.mixin()方法。
这不是项目关键,但我很难理解Javascript中的对象继承。
例如,我尝试用_.keyFilter函数来扩充undercore.js(我意识到我可以使用map来实现类似的功能),以返回满足评估函数的键列表。我可以用_.mixin()方法实现这个结果:
除了将函数直接放入源代码之外,_.mixin()
_.mixin({ filterKey : function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
_.each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)){
results[results.length] = index;
}
});
return results;
}});
然而,我不确定我是否理解为什么我不能在脚本文件中简单地用以下内容来增加下划线:
_.keyFilter = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = index;
});
return results;
};
这样做,然后尝试用调用它
_.chain(myList).keyFilter(evalFunction);
我得到以下异常:
'Uncaught TypeError: Object [object Object] has no method 'keyFilter'
注意,当我将上面的方法放入undercore.js.的源代码中时,它确实有效
所以我试着在我的脚本文件中使用原型(我仍然没有完全掌握):
var keyFilter = _.prototype.keyFilter = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = index;
});
return results;
};
但这也引发了同样的例外。(我认为下面的var被提升到了脚本的顶部,这就是为什么我也尝试了使用和不使用上面的传递赋值)。
如有解释,不胜感激。
这与其说是关于JavaScript的问题,不如说是关于Undercore的问题,Undercore倾向于以自己的方式做事。
-
仅通过将方法作为属性(即
_.keyFilter = ...
)添加到_
中,类似于在Java中将静态方法添加到类中。您正在将该方法添加到_
对象中,但它与_
中的其余功能没有关系。这是添加新实用程序方法的一种合理方式,但如果您想使用Undercore的包装和链接功能,则不是这样。 -
使用
.mixin()
可以挂接Underscore的包装和链接体系结构。这是Underscore特有的——它不是JavaScript的一部分。除了编辑源代码,这是我所知道的利用这些Undercore功能的唯一方法,这些功能在很大程度上依赖于Undercore库中的私有方法和变量。 -
虽然JS支持原型继承,并且每个对象都有一个
prototype
属性,但许多开发人员使用其他方法或其他类型的继承。除非你知道它背后的代码,否则向prototype
中添加一个看起来像构造函数的方法实际上会起作用,这通常不是一个安全的假设。Undercore确实对其包装的对象使用了原型继承,但以一种扭曲的、有点神奇的方式,我认为向prototype
中添加方法不会产生预期的效果-首先,即使它有效,原型也只在Undercore中用于封装的对象,所以_.keyFilter(...)
肯定不起作用。
我认为这是因为(如前所述)"_.keyFilter="向_对象添加了一个方法,但使用_(myList)创建了一个不需要的对象——这就是chain的作用——这是一个不同的对象。
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- JavaScript(Underscore.js)扩展功能
- 如何从chrome扩展在特定网站上触发功能
- 使用多功能框在 chrome 扩展程序中包含内联自动填充功能的任何方法
- Chrome 扩展程序.在弹出菜单中分配具有功能的按钮
- Odoo扩展网站销售JS功能
- 如何让chrome扩展在页面加载的后台执行功能
- 在PhpStorm中创建自定义语言,扩展所有html语言功能
- 扩展点击功能
- 设置超时功能在 chrome 扩展程序弹出窗口.js问题
- 如何在 Sails 中扩展蓝图的功能.js而不覆盖整个蓝图
- 我们可以将Highstocks功能扩展到Highcharts吗?
- Javascript库扩展了原型功能
- 如何为每个标签单独运行 Chrome 扩展程序功能
- 为网站添加增强功能(无论是通过 C#、Chrome 扩展程序等)——不确定什么会起作用
- 可扩展的 Div,在 CSS 中具有过渡功能
- Chrome扩展-功能在javascript不能正常工作
- (部分)扩展“功能”在javascript
- 大型共享代码库,扩展功能
- 主干扩展功能错误