gpt4 book ai didi

javascript - 有时定义对象类型以将实例绑定(bind)方法镜像为构造函数上的静态实用函数有时有用吗?

转载 作者:行者123 更新时间:2023-11-29 14:49:32 24 4
gpt4 key购买 nike

我是 JavaScript 的初学者,目前正在阅读 Thomas A. Powell 和 Fritz Schneider 的The Complete Reference 3rd Edition

我正在学习类属性

我引用了同一本书的摘录。
在将对象类型定义为镜像实例绑定(bind)方法时,它有时也很有用 构造函数 上的静态实用函数。例如,String.prototype.trim() 是在 上运行的字符串实例方法 instance 它是从中调用的。但是,可以定义一个静态效用函数,例如 String.trim(),将其作为唯一参数它应该操作的字符串实例:

if(typeof String.trim == "undefined"){
String.trim = function(str){
alert("Here!");
return str.trim();
}
}

var test = " The International Jew ";
alert(test.trim()); // The International Jew
alert(String.trim(" The International Jew")); // The International Jew

我发现自己真的很困惑,上面的功能给我带来了什么用处,以及什么会促使我进行从一些实例方法的这种转换>静态效用函数?
当我是编程世界的新手时,请指导我理解这个概念。

最佳答案

我使用静态方法而不是实例方法的一个原因是为了处理 null/undefined 对象。如果您使用实例方法,您将始终必须在所有地方包装您的 trim 调用

if (typeof str == "string") {
str = str.strim();
} else {
str = ""; // If you want this
}

然而,如果您有一个静态方法,调用者可以安全地给它一个 null/undefined 对象。

String.trim = function(str){        
return typeof str == 'string' ? str.trim() : '';
}

var str;
// String.trim can handle the undefined object
str = String.trim(str);

此外,正如 dandavis 提到的,您可以将 String.trim 作为回调传递给 forEachmap 等函数,而无需指定this 是什么。

var trimmed = [" a ", " b ", "c "].map(String.trim);

但是,请注意,这只是可能的,因为我们的静态 String.trim 没有使用 this,但您可能会发现有些使用 this 从静态方法引用构造函数,在这种情况下,您需要绑定(bind)它。

例如:

String.doubleTrim = function(str) {
var trimmed = this.trim();
return trimmed + trimmmed;
}
// Error trim is not a function
var doubleTrimmed = [" a ", " b ", "c "].map(String.doubleTrim);
// This is OK
var doubleTrimmed = [" a ", " b ", "c "].map(String.doubleTrim.bind(String));

Note that you could work around the above problem by calling `String.trim()` instead of `this.trim()` but some prefer that because it lets you rename your object from a single place.

关于javascript - 有时定义对象类型以将实例绑定(bind)方法镜像为构造函数上的静态实用函数有时有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27905330/

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