function getValType(elem) { var ret = elem.tagName.toLowerCase() return ret === "input" && /checkbox|radio/.test(elem.type) ? "checked" : ret } var valHooks = { "select:get": function(node, value) { console.log('select:get') }, "select:set": function(node, values, optionSet) { console.log('select:set') } } function val(node, value) { var get = arguments.length === 1 var access = get ? ":get" : ":set" var fn = valHooks[getValType(node) + access] if (fn) { fn(node, value) } else if (get) { return node.value } else { node.value = value } } val(document.querySelector('select')) val(document.querySelector('input'), 2)