面向对象的表现
- 多态
- 继承
- 封装
独特的this,call和apply
原型或者闭包
多态: 同一操作作用于不同的对象上,可产生不同的解释和不同的执行结果.
用继承表现多态
1 | var googleMap = { |
封装:封装数据和封装实现,封装类型和封装变化,es5不考虑封装类型
- 数据层面的封装 :作用域或者叫属性的处理
1 | // myObject 是一个类 |
另外,es6的相关关键字是 let symbol
原型模式和基于原型继承的对象系统
所有的数据都是对象
要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它
对象会记住他的原型
如果对象无法响应某个请求,它会把这个请求委托给自己的原型
- 创建对象,克隆: Object.create
浏览器不支持的处理
1 | Object.create=Object.create || function(obj){ |
- 查看对象的原型
Object.getPrototypeOf(obj)
来查看,对象类型Object prototype
this的指向
- 作为对象的方法调用
- 作为普通函数的调用
- 构造器调用
- Function.prototype.call 或 Function.prototype.appley 调用
use strict
下this将不指向全局 window
1 | function func(){ |
call 和 apply
- call 传入的参数数量不固定,第一个参数是函数体内this指向,之后的参数每个参数依次传入函数.
1 | var func = function(a,b,c){ |
- apply
接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个带下标的集合,数组或者类数组. apply 方法把这个集合中的元素作为参数传递给调用的参数.
1 | var func = function(a,b,c){ |
Function.prototype.bind 用来指定函数内部的this指向.
当浏览器不支持时:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Function.prototype.bind = function(context){
var self = this;
return function(){
return self.apply(context,arguments);
}
}
// 使用
var obj = {
name:'sven'
};
var func = function(){
alert(this.name);
}.bind(obj);
func();
1 | Function.prototype.bind = function(){ |
借用其他对象
1 | var A = function(name){ |
操作arguments ,添加一个值
1
2
3
4(function(){
Array.prototype.push.call(arguments,3);
console.log(arguments);
})(1,2)原型链与闭包的对比 (命令模式)
原型:
1 | <button id="execute">点击我执行命令</button> |
闭包:
1 | var Tv = { |
- 面向切面
1 | Function.prototype.before = function( beforefn ){ |
- 函数柯里化(currying):部分求值
一个 currying 的函数首先会接受一些参数,接受了这些参数之后, 该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保 存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。
- 函数节流
- 分时函数
- 惰性加载函数