mirror of
https://github.com/samsonjs/batteries.git
synced 2026-04-27 15:07:42 +00:00
move prototype extender into object module [broken, refactoring]
This commit is contained in:
parent
0bae38cdb5
commit
2b7db269a3
2 changed files with 24 additions and 19 deletions
18
lib/ext.js
18
lib/ext.js
|
|
@ -1,18 +0,0 @@
|
||||||
// batteries
|
|
||||||
// Copyright 2010 - 2011 Sami Samhuri <sami@samhuri.net>
|
|
||||||
|
|
||||||
exports.extend = function(obj, ext) {
|
|
||||||
Object.keys(ext).forEach(function(k) {
|
|
||||||
if (k in obj.prototype) return; // don't overwrite existing members
|
|
||||||
var wrapper = function() {
|
|
||||||
var fn = ext[k]
|
|
||||||
, args = [].slice.call(arguments)
|
|
||||||
;
|
|
||||||
args.unshift(this);
|
|
||||||
return fn.apply(this, args);
|
|
||||||
};
|
|
||||||
Object.defineProperty(obj.prototype, k, {
|
|
||||||
get: function() { return wrapper; }
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
@ -4,10 +4,11 @@
|
||||||
var ObjectExt =
|
var ObjectExt =
|
||||||
{ cmp: cmp
|
{ cmp: cmp
|
||||||
, extend: extend
|
, extend: extend
|
||||||
|
, extendPrototype: extendPrototype
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.extendNative = function() {
|
exports.extendNative = function() {
|
||||||
require('./ext').extend(Object, ObjectExt);
|
extendPrototype(Object, ObjectExt);
|
||||||
};
|
};
|
||||||
|
|
||||||
extend(module.exports, ObjectExt);
|
extend(module.exports, ObjectExt);
|
||||||
|
|
@ -24,3 +25,25 @@ function extend(a, b) {
|
||||||
a[k] = b[k];
|
a[k] = b[k];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extendPrototype(obj, ext) {
|
||||||
|
Object.keys(ext).forEach(function(k) {
|
||||||
|
// TODO remove this and just warn? ... no good solution for conflicts, needs a human
|
||||||
|
if (k in obj.prototype) return; // don't overwrite existing members
|
||||||
|
var val = ext[k];
|
||||||
|
if (typeof val === 'function') {
|
||||||
|
val = methodWrapper(val);
|
||||||
|
}
|
||||||
|
Object.defineProperty(obj.prototype, k, { value: val });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make a wrapper than passes `this` as the first argument, Python style. All
|
||||||
|
// extension functions that can extend native types must follow this convention.
|
||||||
|
function methodWrapper(fn) {
|
||||||
|
return function() {
|
||||||
|
var args = [].slice.call(arguments);
|
||||||
|
args.unshift(this);
|
||||||
|
return fn.apply(this, args);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue