面向对象编程第六篇--笔记

闭包优化缓存解决递归实现的斐波那契数列存在的性能问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function createFib(){
var arr = [];
function fib(n){
var num = arr[n];
if(!num){
if(n <= 2){
num = 1;
}else{
num = fib(n - 1) + fib(n -2);
}
arr[n] = num;
}
return num;
}
}

jQuery缓存实现

1
2
3
4
5
6
7
8
9
10
11
12
13
function createCache(){
var cache = {};
var keys = [];
return function(key, value){
if(value != undefined){
cache[key] = value;
if(keys.push(key) > 20){
delete cache[keys.shift()];
}
}
return cache[key];
}
}

jQuery缓存源码分析

1
2
3
4
5
6
7
8
9
10
function createCache(){
var keys = [];
function cache(key, value){
if(keys.push(key + " ") > 20){
delete cache[keys.shift()];
}
return (cache[key + " "] = value);
}
return cache;
}

沙箱模式

一个封闭的隔离的环境!

在JS中通过函数来创建沙箱

1
2
3
4
5
6
7
8
(function(window){
//变量的声明

//主要的功能代码

//如果需要,就通过window对象向外界暴露接口

})(window)

将window对象作为参数的目的

  1. 便于代码压缩
  2. 实现逻辑上的隔离,外部不访问里面的东西,里面也不访问外面的东西

沙箱的应用

  1. 框架
  2. 组件
  3. 插件

函数的调用模式

函数调用模式

函数名();
this —> window

方法调用模式

对象.方法名();
this —> 调用该方法的对象

构造函数调用模式

new 函数名();
this —> new创建出来的实例

上下文调用模式

两种创建对象的方式

工厂模式

1
2
3
4
5
6
7
8
function createObj(name, age){
var obj = new Object();
obj.name = name;
obj.age = age;
return obj;
}

var p = createObj("bob", 18);

寄生模式

1
2
3
4
5
6
7
8
function Person(name, age){
var obj = new Object();
obj.name = name;
obj.age = age;
return obj;
}

var p = new Person("bob", 18);

工厂模式和寄生模式都可以用来创建对象,但是调用模式不一样,工厂模式是函数调用模式,寄生模式是构造函数调用模式!

上下文调用模式

call

1
2
3
4
5
函数名.call(obj, arg1...argN);
//功能:
//1. 调用函数
//2. 改变this指向为第一个参数中的对象
//3. 将第二个及以后的所有参数,依次的传递给函数作为实参

apply

1
2
3
4
5
函数名.apply(obj, 数组or伪数组);
//功能:
//1. 调用函数
//2. 改变this指向为第一个参数中的对象
//3. 将第二个参数的数组或者伪数组,中的元素一一拆解,依次传递给函数作为实参

注意事项

  1. 如果call和apply的第一个参数为null或者undefined,this将会指向window
  2. 如果call和apply的第一个参数为值类型的数据,会将值类型的数据转换成其对应的引用类型的数据,this指向该引用类型的数据

tips: 一般情况下apply的传参特性会被使用的居多(转换伪数组为真数组,求最大值)

forEach和map的使用

都可以用来遍历数组

forEach

1
2
3
4
数组.forEach(function(value, index, arr){})
//value:正在遍历的数组元素
//index: 正在遍历的数组元素的索引
//arr: 正在遍历的数组

map

1
2
3
4
数组.map(function(value, index, arr){})
//value:正在遍历的数组元素
//index: 正在遍历的数组元素的索引
//arr: 正在遍历的数组

map是有返回值的,他的返回值是,将每次调用回调函数之后的返回值拼接成一个新的数组,将这个数组返回,作为map的返回值!