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

When is it sometimes useful to defining object types to mirror instance-bound methods as static utility functions on the constructor?

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

我正在学习Class属性.

我引用了同一本书的摘录。
有时在定义 object typesmirror instance-bound[ 时也很有用=47=] 方法作为 静态实用函数 构造函数 .例如,String.prototype.trim()字符串实例方法 在调用它的 实例 上运行。但是,静态效用函数 例如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

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

这是个好问题。 我认为如果你是初学者,最好推迟这部分并继续学习 JavaScript 的其他部分。但是我会回答你。 当我们想要使用或更改对象的基本特征时,我们使用 Prototype(或者如您所说的“实例方法”)。当我们想在类型或 class.

中利用函数的能力时,我们也会使用 static utility functions

例如: 当你想将字符串类型的 "trim"**ing 能力赋予另一个 class(比如例如继承)你可以使用原型。此外,当您想更改 class 或方法的内置功能时,您可以通过更改 **Prototype 来更改它。您可以使用 Prototype 编辑、继承和利用一个类型或 class 的全部特征。您还可以向内置 class 添加新功能(方法)。

使用原型,您可以通过其对象层次结构操纵整个 JavaScript 功能。这就是为什么 JavaScript 很棒。

但是当您想使用函数、类型或 class 的功能时,您可以使用静态实用函数。

在下面的 link 中,我谈到了 JavaScript 拥有的一些奇妙的能力。然而这篇文章是关于更大的东西,但在第一部分我已经讨论了一些鼓舞人心的 JavaScript 能力。

http://www.codeproject.com/Articles/844789/A-Belly-Dance-in-Holy-Lands-of-MVC-MVP-and-MVVM-Pa#xx4977789xx

我使用静态方法而不是实例方法的一个原因是为了处理 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 来引用构造函数,在这种情况下,您需要绑定它。

例如:

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.