Skip to content

Commit 9e94320

Browse files
committed
Merge pull request #38 from jstools/extend-method
added extend method
2 parents 946781a + b8c6a23 commit 9e94320

File tree

3 files changed

+128
-2
lines changed

3 files changed

+128
-2
lines changed

jqlite.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
_isFunction = _isType('function'),
6464
_isString = _isType('string'),
6565
_isNumber = _isType('number'),
66+
_isBoolean = _isType('boolean'),
6667
_isArray = Array.isArray || _instanceOf(Array),
6768
_isDate = _instanceOf(Date),
6869
_isRegExp = _instanceOf(RegExp),
@@ -91,6 +92,56 @@
9192
};
9293
};
9394

95+
var arrayShift = Array.prototype.shift;
96+
97+
function _merge () {
98+
var dest = arrayShift.call(arguments),
99+
src = arrayShift.call(arguments),
100+
key;
101+
102+
while( src ) {
103+
104+
if( typeof dest !== typeof src ) {
105+
dest = _isArray(src) ? [] : ( _isObject(src) ? {} : src );
106+
}
107+
108+
if( _isObject(src) ) {
109+
110+
for( key in src ) {
111+
if( src[key] !== undefined ) {
112+
if( typeof dest[key] !== typeof src[key] ) {
113+
dest[key] = _merge(undefined, src[key]);
114+
} else if( _isArray(dest[key]) ) {
115+
[].push.apply(dest[key], src[key]);
116+
} else if( _isObject(dest[key]) ) {
117+
dest[key] = _merge(dest[key], src[key]);
118+
} else {
119+
dest[key] = src[key];
120+
}
121+
}
122+
}
123+
}
124+
src = arrayShift.call(arguments);
125+
}
126+
127+
return dest;
128+
}
129+
130+
function _extend () {
131+
var dest = arrayShift.call(arguments),
132+
src = arrayShift.call(arguments),
133+
key;
134+
135+
while( src ) {
136+
for( key in src) {
137+
dest[key] = src[key];
138+
}
139+
src = arrayShift.call(arguments);
140+
}
141+
142+
return dest;
143+
}
144+
94145
if( !Element.prototype.matchesSelector ) {
95146
Element.prototype.matchesSelector = (
96147
Element.prototype.webkitMatchesSelector ||
@@ -260,6 +311,30 @@
260311

261312
jqlite.noop = noop;
262313

314+
jqlite.extend = function (deep) {
315+
var args = [].slice.call(arguments);
316+
if( _isBoolean(deep) ) {
317+
args.shift();
318+
} else {
319+
deep = false;
320+
}
321+
if( deep ) {
322+
_merge.apply(null, args );
323+
} else {
324+
_extend.apply(null, args );
325+
}
326+
};
327+
328+
jqlite.isObject = _isObject;
329+
jqlite.isFunction = _isFunction;
330+
jqlite.isString = _isString;
331+
jqlite.isNumber = _isNumber;
332+
jqlite.isBoolean = _isBoolean;
333+
jqlite.isArray = _isArray;
334+
jqlite.isDate = _isDate;
335+
jqlite.isRegExp = _isRegExp;
336+
jqlite.isElement = _isElement;
337+
263338
// document ready
264339

265340
var _onLoad = window.addEventListener ? function (listener) {
@@ -284,6 +359,19 @@
284359

285360
ListDOM.prototype = [];
286361
ListDOM.prototype.ready = ready;
362+
ListDOM.prototype.extend = function (deep) {
363+
var args = [].slice.call(arguments);
364+
if( _isBoolean(deep) ) {
365+
args.shift();
366+
} else {
367+
deep = false;
368+
}
369+
if( deep ) {
370+
_merge.apply(null, [ListDOM.prototype].concat(args) );
371+
} else {
372+
_extend.apply(null, [ListDOM.prototype].concat(args) );
373+
}
374+
};
287375

288376
jqlite.fn = ListDOM.prototype;
289377

0 commit comments

Comments
 (0)