面向对象编程
1. 面向过程、面向对象 OOP、函数式编程
2. 面向对象三大基本特征:封装、继承、多态
封装: 隐藏内部的变量、实现的细节,暴露调用的接口方法
document.getElementById/document.getElementsByTagName
继承:实例化的对象包括了父类所有的属性及方法
多态:方法中根据传入参数个数的不同,实现不一样的功能
3. 类/对象
类是对真实世界事物的一种抽象,一种模型
对象是类的具例化/实例化,属性【特征】跟方法【行为】的集合
类是对象的抽象
纯面向对象编程,要有对象,必需创建一个类
定义一个Person类
class Person(name, age, gender) {
//伪代码
this.name = name;
this.age = age;
this.gender = gender;
this.code = function() {};
this.eat = function() {}
}
class Male extends Person {}
var p1 = new Person("Shafee", 20, "male");//实例化
4. arguments 函数内部的隐含对象,包括了调用参数的类数组对象
5. JavaScript 没有类的概念,基于原型的继承,class在ES6之前是保留字,ES6关键字
6. 原型prototype、对象、构造函数
对象:属性跟方法的集合,属性是静态的数据,方法即行为,操作数据
构造函数:在函数的前面出现new关键字,js内置的构造函数,Date/Object/RegExp/String/Number/Boolean/Function
自定义构造函数:按照约定,首字母大写,跟普通函数区分
调用: new Person() 返回实例对象
var o = new Object();
Object.prototype === o.__proto__
原型prototype、对象、构造函数关系
对象是由构造函数创建,实例化的,字面量赋值,语法糖
对象的属性/方法的查找,a.先从自身查找,找到返回,b.找不到沿着原型链上查找,找到返回,找不到重复b步骤,直到顶级Object.prototype
7. 原型扩展方法
String.prototype.trim 去掉首尾空格
String.prototype.capticalize 首字母大写
Date.format("/")
8. 使用面向对象编程思维重写Tab切换
a.定义构造函数,并确定实例拥有的属性
b.给原型添加行为,即方法
c.实例化对象
//////////////////////////////////////////////////////////////第二天
1. 构造函数、原型、实例三者之间的关系
构造函数:函数调用前存在关键字new的
a.定义,为了跟普通函数区分,按照约定首字母大写
b.调用时使用关键字new
c.返回值,创建出来的实例
d.内部的this,指向创建出来的实例
函数定义,必存在prototype属性,指向原型
原型:属性跟方法的集合,也是一个对象[__proto__]
实例:通过构造函数创建出来的对象
必存在属性__proto__,指向原型,对象属性的查找,先从自身查找,找不到,沿着原型链从原型查找...
换句话说,对象的属性跟方法从原型上继承下来,对象的属性、方法可以重写
2. 对象的复制
for...in 遍历对象,找出自身的属性,且会搜索原型,即也会查找原型上的属性
__proto__不可枚举的属性
obj.hasOwnProperty() 返回布尔值,判断对象的属性是否自有/自身属性
JSON.parse(JSON.stringify(o1)) 可以将只有属性/不存在方法的对象复制
JSON.stringify 将对象转换成字符串,转换的过程,会忽略掉方法
3. instanceof 判断对象是否是构造函数的实例,是返回true,否返回false
obj instanceof Object
1. review
obj.hasOwnProperty(name) 判断属性name是否obj对象的自身属性
for...in 遍历对象/数组
o1 instanceof Object 判断实例对象o1是否为Object所创建的实例
jQuery 仿写