winter/modules/system/assets/ui/js/foundation.baseclass.js
2016-11-06 17:14:12 +01:00

79 lines
2.3 KiB
JavaScript

/*
* October JavaScript foundation library.
*
* Base class for OctoberCMS back-end classes.
*
* The class defines base functionality for dealing with memory management
* and cleaning up bound (proxied) methods.
*
* The base class defines the dispose method that cleans up proxied methods.
* If child classes implement their own dispose() method, they should call
* the base class dispose method (see the example below).
*
* Use the simple parasitic combination inheritance pattern to create child classes:
*
* var Base = $.oc.foundation.base,
* BaseProto = Base.prototype
*
* var SubClass = function(params) {
* // Call the parent constructor
* Base.call(this)
* }
*
* SubClass.prototype = Object.create(BaseProto)
* SubClass.prototype.constructor = SubClass
*
* // Child class methods can be defined only after the
* // prototype is updated in the two previous lines
*
* SubClass.prototype.dispose = function() {
* // Call the parent method
* BaseProto.dispose.call(this)
* };
*
* See:
*
* - https://developers.google.com/speed/articles/optimizing-javascript
* - http://javascriptissexy.com/oop-in-javascript-what-you-need-to-know/
* - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
*
*/
+function ($) { "use strict";
if ($.oc === undefined)
$.oc = {}
if ($.oc.foundation === undefined)
$.oc.foundation = {}
$.oc.foundation._proxyCounter = 0
var Base = function() {
this.proxiedMethods = {}
}
Base.prototype.dispose = function() {
for (var key in this.proxiedMethods) {
this.proxiedMethods[key] = null
}
this.proxiedMethods = null
}
/*
* Creates a proxied method reference or returns an existing proxied method.
*/
Base.prototype.proxy = function(method) {
if (method.ocProxyId === undefined) {
$.oc.foundation._proxyCounter++
method.ocProxyId = $.oc.foundation._proxyCounter
}
if (this.proxiedMethods[method.ocProxyId] !== undefined)
return this.proxiedMethods[method.ocProxyId]
this.proxiedMethods[method.ocProxyId] = method.bind(this)
return this.proxiedMethods[method.ocProxyId]
}
$.oc.foundation.base = Base;
}(window.jQuery);