面向对象 (Object Oriented Programming), 其实它是一种编程思路.
在初学的时候很多时候无法区别什么是面向对象和面向过程 (Procedure Oriented) 的区别, 这里开玩笑的说一下: 在初学的时候当我们要实现一个功能, 去想法设法的去实现它, 让步骤一步步实现, 使用一个一个依次调用. 这样的实现方式往往是面向过程. 而当我们把功能拆分, 把功能细分为一个个模块, 功能在实现过程中调用个个模块中的方法数据, 这样就可能是一个面向对象的思路.
因为 javascript 不同于 java 一样, 没有类的概念以及 private,public 这些关键字, 因此我们可以利用函数的作用域来模拟类的概念:
var createObject = function(){
// private
let data = 'Hello World';
// public 公共方法和变量
return {
name:'D',
getData(){console.log(data)
}
}
}
let obj = createObject();
console.log(obj); // 没有变量 data, 有 name 和 getData
obj.getData() // 打印输出 Hello World
面向对象的特征:
1. 对象唯一性: 每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象.
2. 抽象性: 将具有一致的数据结构(属性)和行为(操作)的对象抽象成类, 形成一个接口可供调用.
3. 继承性: 子类可以从父类那里共享父类的方法和数据结构, 子类也可以保留自己的数据结构和方法.
4. 多态: 相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果.
对象的组成:
1. 方法 调用的函数, 执行计算等其他操作
2. 属性: 存放静态数据的地方, 供方法调用
如何创建对象:
1. 对象字面变量创建
let obj = {
name:'Hello World',
getData(){// do something}
}
2. 工厂模式
function createObjcet(name){let o = new Object();
o.name=name;
o.getData=function(){// do something}
return o
}
let obj = createObjcet('Hello World')
3. 构造函数
function createObjcet(name){
this.name = name;
this.getData=function(){// do something}
}
let obj = new createObjcet('Hello World');
4. 原型模式
function createObjcet(){}
createObjcet.prototype.name='Hello World'
createObjcet.prototype.getData = function(){// do something}
let obj = new createObjcet()~~~~
这里 prototype 是什么?
我们创建的每个函数都有一个 prototype(原型)属性, 这个属性是一个指针, 指向的是一个对象, 而这个对象的用途包含可以由特定类型的所有实例共享的属性和方法.prototype 就是通过调用构造函数而创建的那个对象实例的原型对象. 可以让所有对象实例共享它的属性和方法.