复习
编程思想
面向过程:一步一步做
面向对象:找对象解决;
js基于对象模拟面向对象
面向对象的特性
- 封装(property method 封装有利于代码的复用)
- 继承(继承父类的属性和方法 js中没有类的概念但是有构造函数)
- 多态(父类的引用指向子类对象 不同的子类的属性和方法可能不一样)
- 抽象性(abstract)
eg:
// 面向对象执行者变成了指挥者
function eat(){
eatFood();
};
function eatFood(){
alert('执行吃饭');
}
自定义构造函数方式创造的对象才有类的概念
工厂模式和构造函数创建对象
相同点:都是函数 可以创建对象 可以传参
不同点:
- 工厂模式首字母小写 自定义构造函数首字母大写
- 工厂模式有返回值 自定义构造函数没有
- 工厂模式里有new 自定义构造函数没有
- 工厂模式直接调用函数创建里面new出来的对象 自定义构造函数通过new创建对象
原型
原型的作用
- 共享数据,节省内存空间
实例和构造函数的关系
- 实例对象通过构造函数创建 创建的过程叫实例化
- 判断对象的类型:
- 实例对象 instanceof 构造函数名字//尽量用这种方式
- 实例对象.构造器 == 构造函数名字 //可能不准确
原型的对象:
- proto 浏览器使用的 不是标准的属性(实例对象)
- prototype 程序员使用 标准属性(构造函数)
构造函数 实例对象 和原型对象三者的关系
function Person(name) {
this.name = name;
};
Person.prototype.eat = function () { };
var per = new Person('小明');
//
// Person构造函数的属性和方法有:
// 1. name:
// 2. prototype :指向原型对象
// 实例对象per的属性和方法:
// 1. name:
// 2. __proto__ :指向原型对象
// 原型对象的属性和方法:
// 1. 系统自带的属性
// 2. constructer 也就是构造器指向的是自己的构造函数
// 3. 自己添加的方法eat;
// 实例对象可以调用原型对象的属性和方法 并且数据共享,节省内存空间
原型链
- 实例对象和原型对象中的关系是通过原型来联系的 这个关系叫做原型链
- 改变原型指向,应在改变之后添加方法才能访问到
// 构造函数 创建 实例对象
// 实例对象中有一个属性__proto__
// 构造函数中有一个属性prototype
// __proto__和prototype指向同一个原型对象 区别prototype是标准属性 程序员用的;__proto__是给浏览器用 程序员也可以使用
// 原型对象中有一个属性constructor指向了构造函数
// 实例对象可以直接方法原型对象中的属性和方法
// 调用实例对象的方法和属性 先在构造函数中找 找不到再到原型对象中找 再找不到就报错
use strict
严格模式
Function
所有的函数都是Function的实例对象
call和apply在Function的原型里存在 函数实例可以调用
属性:
- name //函数的名字只读不能修改
- arguments.length//实参的个数
- length//形参的个数
- caller()//调用者
bind
bind(对象);//改变this的指向为参数里的对象
函数.bind(对象);//复制函数并将参数传进这个函数 再返回这个函数 通过调用这个返回的函数来使用这个函数/方法
apply和 call
作用:改变this的指向
应用:把别的对象的方法当成自己对象的方法来用
这两个方法在Function.prototype中
函数.call(对象,参数列表);
函数.apply(对象,[参数列表]);
function fn(){};
fn.apply();//相当于传入了一个null或者直接传入一个null 调用该方法的函数对象中的this就是默认的window
借用函数给传入的对象调用一次并将函数中的this指向传入的对象
函数/方法.apply(对象,[parm]);
作用域和作用域链
- 作用域:变量的使用范围
js中无块级作用域 {}内定义的变量 外部可以访问
函数中定义的变量是局部变量 函数外面访问不到 - 作用域链:变量的使用 从内到外 就近原则 如果一直到全局变量都没有找到就报错
闭包
作用:缓存数据
闭包方法:放在外层和里层中间的函数内
缺点:浪费内存
沙箱
把代码放到()内 防止变量发生冲突
递归
山上有个庙 庙里有个和尚 和尚正
apply总结
- apply和call的共同点:
一个对象想用其他对象的方法可以使用apply:
函数/其他对象的方法.apply(obj,[参数1,参数2,…]); 借用一次别人的方法那来自己用 并且将这个方法里面的this变成第一个参数obj当场调用一次 - 区别:
call与apply用法基本相同 区别是 apply的参数列表是数组形式 而call是用逗号隔开
bind是将这个方法/函数复制一遍并返回一个函数,需要调用这个返回的函数来使用这个方法
拷贝
深拷贝 把一个对象中所有的数据拷贝到另一个对象中 效率低费时