gpt4 book ai didi

JavaScript (Underscore.js) 扩展功能

转载 作者:搜寻专家 更新时间:2023-11-01 04:19:08 29 4
gpt4 key购买 nike

免责声明:(1) 我的背景是 Java/C#,我上周才开始深入研究 JavaScript。 (2) 我知道 _.mixin() 方法。

这不是项目关键,而是我无法理解 Javascript 中的对象继承。

例如,尝试使用 _.keyFilter 函数扩充 underscore.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' 

请注意,当我将其放入 underscore.js 的源代码中时,上述方法确实有效。

然后我尝试在我的脚本文件中使用原型(prototype)(我仍然没有完全掌握):

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 的问题,不如说是一个关于 Underscore 的问题,它倾向于以自己的方式做事。

  • 将方法添加到 _ 只需将其添加为属性(即 _.keyFilter = ...)类似于将静态方法添加到Java 中的一个类。您正在将方法添加到 _ 对象,但它与 _ 中的其余功能无关。这是添加新实用程序方法的合理方式,但如果您想使用 Underscore 的包装和链接功能,则不行。

  • 使用 .mixin() 允许您连接到 Underscore 的包装和链接架构。这是 Underscore 特有的——它不是 JavaScript 的一部分。除了编辑源代码之外,这是我所知道的利用这些 Underscore 功能的唯一方法,这些功能在很大程度上依赖于 Underscore 库中的私有(private)方法和变量。

  • 虽然 JS 支持原型(prototype)继承,并且每个对象都有一个 prototype 属性,但许多开发人员使用其他方法或其他类型的继承。将方法添加到看起来像构造函数的东西的 prototype 中通常是不安全的,除非您知道其背后的代码。 Underscore 确实对其包装的对象使用原型(prototype)继承,但是以一种扭曲的、有点神奇的方式,我不认为向原型(prototype)添加方法会产生预期的效果——一方面,即使可行,原型(prototype)仅在 Underscore 中用于包装对象,因此 _.keyFilter(...) 肯定行不通。

关于JavaScript (Underscore.js) 扩展功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283625/

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