1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
var oop = exports;
oop.forceMixin = function(child /*, Parent1, ... */) {
for (i = 1; i < arguments.length; i++) {
oop._forceMixin(child, arguments[i]);
}
};
oop.mixin = oop.forceMixin;
oop._forceMixin = function(child, Parent) {
oop._forceCopyPrototype(child, Parent);
Parent.call(child);
};
oop._forceCopyPrototype = function(child, Parent) {
for (var property in Parent.prototype) {
oop._copyPrototypeProperty(child, Parent, property);
};
};
oop._copyPrototypeProperty = function(child, Parent, property) {
Object.defineProperty(child, property, {
value: Parent.prototype[property],
writable: true,
enumerable: false,
configurable: true
});
};
oop.strictMixin = function(child /*, Parent1, ... */) {
for (i = 1; i < arguments.length; i++) {
oop._strictMixin(child, arguments[i]);
}
};
oop._strictMixin = function(child, Parent) {
oop._strictCopyPrototype(child, Parent);
oop._strictCallConstructor(child, Parent);
};
oop._strictCopyPrototype = function(child, Parent) {
for (var property in Parent.prototype) {
if (child[property] === undefined) {
oop._copyPrototypeProperty(child, Parent, property);
continue;
}
oop._error(
'oop.strictMixin(): Class "' + Parent.name + '" tried to overwrite ' +
'prototype property "' + property + '".'
, oop.strictMixin);
};
};
oop._strictCallConstructor = function(child, Parent) {
var original = {};
for (var property in child) {
original[property] = child[property];
}
Parent.call(child);
for (var property in original) {
if (child[property] === original[property]) {
continue;
}
oop._error(
'oop.mixin(): Class "' + Parent.name +
'" tried to overwrite property "' + property + '".'
, oop.strictMixin);
}
};
oop.softMixin = function(child /*, Parent1, ... */) {
for (i = 1; i < arguments.length; i++) {
oop._softMixin(child, arguments[i]);
}
};
oop._softMixin = function(child, Parent) {
oop._softCopyPrototype(child, Parent);
oop._softCallConstructor(child, Parent);
};
oop._softCopyPrototype = function(child, Parent) {
for (var property in Parent.prototype) {
if (child[property] !== undefined) {
continue;
}
oop._copyPrototypeProperty(child, Parent, property);
};
};
oop._softCallConstructor = function(child, Parent) {
var original = {};
for (var property in child) {
original[property] = child[property];
}
Parent.call(child);
for (var property in original) {
child[property] = original[property];
}
};
oop._error = function(message, traceOrigin) {
var error = new Error(message);
Error.captureStackTrace(error, traceOrigin);
throw error;
};
oop.extend = function(Child, Parent) {
Child.prototype = Object.create(Parent.prototype, {
constructor: {
value: Child,
enumerable: false
}
});
for (var property in Parent) {
if (Child[property] !== undefined) {
continue;
}
Child[property] = Parent[property];
}
};
|