Skip to content

Instantly share code, notes, and snippets.

@cyan33
Created October 29, 2017 02:59
Show Gist options
  • Save cyan33/68e34b99d112a53acf4cbc26cdb7a912 to your computer and use it in GitHub Desktop.
Save cyan33/68e34b99d112a53acf4cbc26cdb7a912 to your computer and use it in GitHub Desktop.
the `extend` function in underscore
// 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