function constfunc(v){ return function(){return v}}var funcs = []for(var i = 0; i < 10; i++){ funcs[i] = constfunc(i)}
闭包序列
function constfunc(v){ return function(){return v}}var funcs = []for(var i = 0; i < 10; i++){ funcs[i] = constfunc(i)}
闭包计数器
function counter(){ var n = 0; return { count: function(){return n++;}, reset: function(){n = 0;} };}
属性存取器
function counter(n){ return{ get count() {return n++}, set count(m){ if(m >= n) {n = m } else {throw Error("count can only be et to a larger value")} } }}var c = counter(1000);c.count;
属性define
Object.defineProperty(Object.prototype, "extend", { writable: true, enumerable: false, configurable: true, value: function(o){ var names = Object.getOwnPropertyNames(o); for(var i = 0; i < names.length; i++){ if(names[i] in this) continue; var desc = Object.getOwnPropertyDescriptor(o, names[i]); Object.defineProperty(this, names[i], desc); } }});
私有属性
function addPrivateProperty(o, name, predicate){ var value; o["get" + name] = function(){return value;} o["set" + name] = function(v){ if(predicate && ! predicate(v)) {throw Error("set" + name + ": invalid value " + v)} else {value = v} };}var o = {}addPrivateProperty(o, "Name", function(x){ return typeof x == "string";});o.setName("A");o.setName(o);
嵌套属性名
function getAllPropertyNames = function(obj){ var props = []; do { props = props.concat(Object.getOwnPropertyNames(obj)); } while (obj = Object.getPrototypeOf(obj)); return props;}
嵌套属性名2
function keys(o){ if(typeof o !== "object") throw TypeError(); var result = []; for(var prop in o){ if(o.hasOwnProperty(prop)) result.push(prop); } return result;}
嵌套累加
function flexisum(a){ var total = 0; for(var i = 0; i < arguments.length; i++) { var element = arguments[i], n; if(element == null){ continue; } else if(isArray(element)){ n = flexisum.apply(this, element); } else if(typeof element === "function"){ n = Number(element()); } else{ n = Number(element); } if(isNaN(n)){ throw Error("flexisum(): can't convert " + element + " to number"); } total +=n; } return total;}
泛函代理, monkey-patching ‘this’
function trace(o, m){ var original = o[m]; o[m] = function(){ return original.apply(this, arguments); }}
var ticking = true;var clock = function() { if (ticking) {console.log('Tick');} else {console.log('Tock');} ticking = !ticking}
递归next
function run(fn) { var gen = fn(); function next (err, data) { var result = gen.next(data); if (result.done) {return result.value;} result.value(next); } next();}run(gen);
generator, promise, 递归next2
var readFile = function(fileName) { return new Promise(function (resolve, reject) { fs.readFile(fileName, function(err, data) { if(err) {reject(err);} resolve(data); }) })}var gen = function* () { var f1 = yield readFile('/etc/fstab');}function run(gen) { var g = gen(); function next(data) { var result = g.next(data); if (result.done) {return result.value;} result.value.then(function(data) { next(data); }) } next()}run(gen);
co, thunkify
var readFile = thunkify(fs.readFile);var gen = function* () { var r1 = yield readFile('/etc/fstab'); var r2 = yiled readFile('/etc/shells')}co(gen)
mixins注解
function mixins (...list) { return function (target) { Object.assign(target.prototype, ...list) }}const Foo = { foo() {}}@mixins(Foo)class MyClass()