面向对象编程(OOP):
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
术语:
Class 类 -- 模子
Object 对象 -- 类的实例,实体
Property 属性 -- 对象的静态特征
Method 方法 -- 对象的动作行为,函数
Constructor 构造函数 -- 对象初始化的瞬间, 被调用的方法,主要实现对象初始化
OOP三大特性:
封装:一种把数据和相关的方法绑定在一起使用的方法
继承:一个类可以继承另一个类的特征
多态:多意为‘许多’,态意为‘形态’。不同类可以定义相同的方法或属性。
抽象:抽取对象
对象创建方式:
a. 对象直接量
{
属性名1 : 属性值,
属性名2 : 属性值,
属性名3 : 属性值,
方法1 : function() {},
方法2 : function() {},
}
b. new Object()
// 创建对象
var obj = new Object(); // {}
// 为对象添加属性
obj.属性名1 = 属性值;
obj.属性名2 = 属性值;
// 为对象添加方法
obj.方法名1 = function(){};
obj.方法名2 = function(){};
缺点:不适用于大量对象的创建
c. 工厂方式
function createStudent(no, name, age, sex) {
var stu = new Object();
stu.no = no;
stu.name = name;
stu.age = age;
stu.sex = sex;
stu.study = function() {};
stu.sleep = function() {};
return stu;
}
缺点:不能区分对象具体的类型
d. 构造函数
function Student(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.study = function() {};
this.sleep = function() {};
}
使用 new 来调用构造函数,创建对象实例时,构造函数中的 this 指向的是通过 new 所创建出来的对象本身。
注意:这种方式所创建出来的对象,对象中的方法在内存资源分配上显得比较冗余
e. 构造函数 + prototype
prototype - 原型
作用:资源共享
(函数也是特殊的对象)
prototype -- 原型对象:每个函数都有这个属性
__proto__ -- 原型属性:每个对象都有这个属性,该属性指向的是创建对象所调用构造函数的 prototype
对象属性查找时,先在对象自身空间中查找,不能找到,则到原型中查找,原型中不存在,再到
原型的原型中(原型链)查找,直到找到为止。如果一直查找到 Object.prototype(终点) 中都
不存在,则返回 undefined。
通常在构造函数中初始化静态特征(属性),在原型中添加动作(方法)。
JS中的对象都是基于原型的。
typeof 表达式; // 求数据类型
obj instanceof ConstructorName
判断 obj 对象是否是 ConstructorName 的实例或后代
Array.isArray()
obj instanceof Array
f. ES5中 Object.create()
g. ES6中 class
class 类名 {
constructor() {}
method1(){}
method2(){}
}
h. ...