commit 9700cdde387b28678e3e9cf085b5fa44ce2da4ac
parent f7220378ddd3993cf89b3d29e8cd599283346db9
Author: Aurimas Vinckevicius <aurimas.dev@gmail.com>
Date: Sun, 2 Nov 2014 13:48:45 -0600
Add Zotero.extendClass
Diffstat:
1 file changed, 40 insertions(+), 0 deletions(-)
diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js
@@ -1614,6 +1614,46 @@ Components.utils.import("resource://gre/modules/osfile.jsm");
/**
+ * Defines property on the object
+ * More compact way to do Object.defineProperty
+ *
+ * @param {Object} obj Target object
+ * @param {String} prop Property to be defined
+ * @param {Object} desc Propery descriptor. If not overriden, "enumerable" is true
+ * @param {Object} opts Options:
+ * lateInit {Boolean} If true, the _getter_ is intended for late
+ * initialization of the property. The getter is replaced with a simple
+ * property once initialized.
+ */
+ this.defineProperty = function(obj, prop, desc, opts) {
+ if (typeof prop != 'string') throw new Error("Property must be a string");
+ var d = { __proto__: null, enumerable: true, configurable: true }; // Enumerable by default
+ for (let p in desc) {
+ if (!desc.hasOwnProperty(p)) continue;
+ d[p] = desc[p];
+ }
+
+ if (opts) {
+ if (opts.lateInit && d.get) {
+ let getter = d.get;
+ d.get = function() {
+ var val = getter.call(this);
+ this[prop] = val; // Replace getter with value
+ return val;
+ }
+ }
+ }
+
+ Object.defineProperty(obj, prop, d);
+ }
+
+ this.extendClass = function(superClass, newClass) {
+ newClass._super = superClass;
+ newClass.prototype = Object.create(superClass.prototype);
+ newClass.prototype.constructor = newClass;
+ }
+
+ /**
* Allow other events (e.g., UI updates) on main thread to be processed if necessary
*
* @param {Integer} [timeout=50] Maximum number of milliseconds to wait