Created
October 29, 2017 02:59
-
-
Save cyan33/68e34b99d112a53acf4cbc26cdb7a912 to your computer and use it in GitHub Desktop.
the `extend` function in underscore
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// in the namespace of `_` | |
// The simplest extend | |
function simpleExtend(obj, src) { | |
for (let key in src) { | |
obj[key] = src[key] | |
} | |
return obj | |
} | |
// the two different type of configuration of key assigners | |
_.keys = function(obj) { | |
if (Object.keys) return Object.keys(obj) | |
const keys = [] | |
for (let key in obj) { | |
if (obj.hasOwnProperty(key)) keys.push(key) | |
} | |
return keys | |
} | |
_.allKeys = function(obj) { | |
const keys = [] | |
for (let key in obj) { | |
keys.push(key) | |
} | |
return keys | |
} | |
// ------------------------------------- | |
function createAssigners(keyAssigner, undefinedOnly = false) { | |
return function(obj, ...args) { | |
if (!args.length) return obj | |
args.forEach(target => { | |
const keys = keyAssigner(target) | |
for (let key of keys) { | |
if (!undefinedOnly || !obj[key]) { | |
obj[key] = target[key] | |
} | |
} | |
}) | |
return obj | |
} | |
} | |
_.extend = createAssigners(_.keys) | |
_.extendAll = createAssigners(_.allKeys) | |
_.defaultExtendAll = createAssigners(_.allKeys, true) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment