我真的不明白在“预加载器工厂”(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'
答案 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并开始使用它。它现在自成一体。提供进度报告,告知其完成时间等。