function makeMap (str, expectsLowerCase) {
// 构建闭包集合map
var map = Object.create(null);
var list = str.split(',');
for (var i = 0; i < list.length; i++) {
map[list[i]] = true;
}
return expectsLowerCase
? function (val) { return map[val.toLowerCase()]; }
: function (val) { return map[val]; }
}
// 利用闭包,每次判断是否是内置标签只需调用isHTMLTag
var isHTMLTag = makeMap('html,body,base,head,link,meta,style,title')
console.log('res', isHTMLTag('body')) // true
3. 二维数组扁平化 V. T1 Z, L4 J) B% }; Y- k6 G, i" o vue中_createElement格式化传入的children的时候用到了simpleNormalizeChildren函数,原来是为了拍平数组,使二维数组扁平化,类似lodash中的flatten方法。$ M8 x1 \' W0 C/ _# ~ t. M, r
// 继承方法
function inheritPrototype(Son, Father) {
var prototype = Object.create(Father.prototype)
prototype.constructor = Son
// 把Father.prototype赋值给 Son.prototype
Son.prototype = prototype
}
function Father(name) {
this.name = name
this.arr = [1,2,3]
}
Father.prototype.getName = function() {
console.log(this.name)
}
function Son(name, age) {
Father.call(this, name)
this.age = age
}
inheritPrototype(Son, Father)
Son.prototype.getAge = function() {
console.log(this.age)
}
运行结果测试:9 M7 T! @9 R b' q: a. k
var son1 = new Son("AAA", 23)5 B& e; n+ i6 j% W. j, \2 B
son1.getName() //AAA, K8 \+ T- b) ~" } q( H$ Y! R1 L5 P
son1.getAge() //23 : j k. v+ Y1 e9 ason1.arr.push(4) 5 U1 A4 \) ]3 r& b& a9 o
console.log(son1.arr) //1,2,3,4 ; v+ R5 |0 f1 t B% E4 z5 i. v. r4 Z6 X
var son2 = new Son("BBB", 24) ; P+ \/ h' U% ]& D/ b& nson2.getName() //BBB; a1 b5 q3 t+ T: {+ Y1 ^0 A5 o
son2.getAge() //24 ' u4 k; a: K$ R- K I9 E4 Econsole.log(son2.arr) //1,2,3$ E3 a/ X) o' L0 @* _+ I2 a1 F 6. 执行一次 + C$ V8 M4 Q c5 T2 p once 方法相对比较简单,直接利用闭包实现就好了。& D" I. N8 [7 z; V C) ]9 k' y