Javascript 在这个工厂使用原型和静态方法的目的是什么?

Javascript 在这个工厂使用原型和静态方法的目的是什么?,javascript,angularjs,prototype,Javascript,Angularjs,Prototype,我真的不明白本在下面的链接中编写的“预加载工厂”(AngularJS)中使用“静态方法”和“实例方法(原型)”的主要目的 我知道原型和构造器是如何工作的,但我从未见过像这样的函数的实际操作。为什么不把所有的代码放在一个函数中而不使用原型和静态方法呢 有人能帮我理解这一点吗 谢谢 app.factory( "preloader", function( $q, $rootScope ) { function Preloader( image

我真的不明白本在下面的链接中编写的“预加载工厂”(AngularJS)中使用“静态方法”和“实例方法(原型)”的主要目的

我知道原型和构造器是如何工作的,但我从未见过像这样的函数的实际操作。为什么不把所有的代码放在一个函数中而不使用原型和静态方法呢

有人能帮我理解这一点吗

谢谢

app.factory(
        "preloader",
        function( $q, $rootScope ) {

            function Preloader( imageLocations ) {
                // All the initial variables, deferred and promise here.
            }


            // ---
            // STATIC METHODS.
            // ---

            Preloader.preloadImages = function( imageLocations ) {
                var preloader = new Preloader( imageLocations );
                return( preloader.load() );
            };

            // ---
            // INSTANCE METHODS.
            // ---

            Preloader.prototype = {
                // public methods and private methods here

            };

            return( Preloader );
        }
    );
你是对的,你不必使用原型模式来实现这一点。然而,这样做可以为您提供一个可靠的设计模式,可以很好地应用于这个特定的(以及大多数其他的)。另外,当将
预加载到这样的类中时,现在将其提取到库中并在其他项目中使用(如果您愿意)会变得容易得多

因此,让我们深入了解为什么要使用构造函数、静态方法和实例方法(在原型中)。答案涉及到对经典的理解,而不是这个特殊的例子

预加载图像
静态方法:静态方法在所有对象之间共享,这意味着它用于执行您可能要为类
预加载程序
创建的所有对象所共有的任务。在这种情况下,静态方法“preload images”只是创建它自己类的一个新实例,将要加载的所有图像位置传递给它,然后返回一个
promise
,该方法可用于跟踪是否加载了所有图像

this
:作者在构造函数中创建并分配给
this
的任何属性基本上都是实例变量,每个对象都是唯一的

function Preloader( imageLocations ) {
     ....
     // I keep track of the current state of the preloader.
     this.state = this.states.PENDING;
     ....
}
prototype
:在JavaScript中,添加到“prototype”对象的任何函数都是实例方法,这意味着它们分别作用于调用它们的对象。原型方法通常可以访问
这个
对象,使用它可以创建、修改或返回实例变量。 例如,作者添加到原型中的方法是检查类的
预加载
this.state
,并返回它,以便在应用程序中使用

Preloader.prototype = {
   isInitiated: function isInitiated() {
       return( this.state !== this.states.PENDING );
    }
} 
那么为什么要将预加载程序变成一个类呢?毕竟,它的静态方法是调用自己的控制器并只创建一个对象

一开始似乎有悖常理。但当您考虑如何在典型应用程序上使用图像预加载程序时,它确实是有意义的。通常,您希望在页面或应用程序中的多组图像上使用
预加载程序。另外,angular中的
工厂
返回一个
单例
,预加载程序现在符合这些标准


要做到这一点,作者不必重复代码,只需创建另一个预加载程序并开始使用它。它现在是自给自足的。提供进度报告,告知何时完成等

可能是因为静态方法用于形成角度模块,用户将使用实例方法..很好!谢谢你的回复。这一切都有道理。我有一件事我不明白你在下面的句子中说的“控制器”这个词。“毕竟它的静态方法是调用自己的控制器,只创建一个对象!”这是什么?