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

时间:2015-09-24 02:25:00

标签: javascript angularjs prototype

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

http://www.bennadel.com/blog/2597-preloading-images-in-angularjs-with-promises.htm

我知道原型和构造函数是如何工作的,但我从来没有在这样的函数中看到过真正的动作。为什么不在不使用原型和静态方法的情况下将所有代码放在函数中?

有人能帮助我理解这个吗?

谢谢!

[Thu Sep 24 07:06:47.540295 2015] [core:notice] [pid 14439] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Thu Sep 24 07:06:47.541787 2015] [suexec:notice] [pid 14439] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Thu Sep 24 07:06:47.569389 2015] [so:warn] [pid 14439] AH01574: module rewrite_module is already loaded, skipping
[Thu Sep 24 07:06:47.572287 2015] [auth_digest:notice] [pid 14439] AH01757: generating secret for digest authentication ...
[Thu Sep 24 07:06:47.573315 2015] [lbmethod_heartbeat:notice] [pid 14439] AH02282: No slotmem from mod_heartmonitor
[Thu Sep 24 07:06:47.600913 2015] [mpm_prefork:notice] [pid 14439] AH00163: Apache/2.4.6 (CentOS) PHP/5.4.16 configured -- resuming normal operations
[Thu Sep 24 07:06:47.600943 2015] [core:notice] [pid 14439] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'

1 个答案:

答案 0 :(得分:2)

你是对的,你没有 使用原型图案来实现这一点。但是,这样做会为您提供一个可靠的设计模式,适用于此特定(以及大多数其他)非常好。此外,当将Preloader转换为这样的类时,现在可以更轻松地将其提取到库中并在其他项目中使用(如果您愿意)。

因此,让我们深入研究为什么使用构造函数,静态方法和实例方法(在原型中)。答案涉及,比这个特定的例子更能理解经典Object Oriented Programming

preloadImages静态方法:静态方法在所有对象之间共享,这意味着它用于执行您可能要为类PreLoader创建的所有对象共有的任务。在这种情况下,静态方法'preLoadImages'只是创建它自己的类的新实例,将所有图像位置传递给加载,然后返回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对象,使用它可以创建,修改或返回实例变量。 例如,作者添加到原型的isInitiated方法是检查类this.state的{​​{1}}并返回它,因此可以在应用程序中使用它。

PreLoader

那么为什么让Preloader成为一个类?毕竟它的静态方法是调用自己的控制器并只创建一个对象!

首先看起来很直观。但是当你考虑如何在典型应用程序中使用图像预加载器时,它确实有意义。通常,您希望在页面或应用程序的多组图像上使用Preloader.prototype = { isInitiated: function isInitiated() { return( this.state !== this.states.PENDING ); } } 。角度Preloader也会返回factory,Preloader现在符合这些标准。

要做到这一点,作者现在不必重复代码,只需创建另一个Preloader并开始使用它。它现在自成一体。提供进度报告,告知其完成时间等。