一.面向对象的概念
什么是对象
在代码中需要完成某些事情, 就需要对象来完成
这个对象一定需要包含行为( 函数 ), 同时需要包含一些变量存储数据特征.
对象的行为常常称为 方法( method )
对象存储数据的变量 称为 对象的属性 ( property )
在 JavaScript 中 键值对 就是 对象. 如果键值存储的是数据那么这个就是属性, 如果键值存储的是函数那么就是方法.
二.创建对象
1.其他语言
传统编程语言的方式,比如java,用的就是class类,定义一个模版,然后根据模版来创建对象,这个模版决定来该对象具有射门属性以及什么方法
在es6中js也添加了class的语法糖。
class 类名 {
成员
}
// 定义好类以后就好比有了一个模板
// 利用这个模板就可以创建对象
var obj = new 类名()
2.JavaScript 的方式
(1).字面量
什么是字面量( literal ). 简单的说 就是 写出来就有数据值 就有类型的量.
比如 “5678” [] 123456
在 js 中使用 花括号表示 一个 对象. 对象的成员 采用 键值对的 语法放在花括号中. 如果有多个成员采用逗号分隔.
{''joyce":145,"jack":90,....}
(2).结合对象的动态特性来创建对象
所谓的 对象的 动态特性 就是指 对象原本没有成员, 我们可以人为的为其赋值一个属性或方法, 那么这个对象就有这个成员了.
var person = {}; person.name = 'jack'; // 如果该对象之前没有 name 属性, 那么该代码就会给对象增加该属性 person.age = 20; person.gender = '女'; person.sayHello = function () { };
这个写法有一个缺点, 就是必须是硬编码. 如果说可以允许在代码执行的时候 动态的给对象增加成员. 那才是真正的动态.
换句话说, 希望有一个变量, 存储属性的名字, 然后有一个变量存储对应的属性的值, 那么利用这个两个变量动态给对象增加属性
(3).工厂函数
function creatPerson(name, age, gender) { this.name = name; this.age = age; this.gender = gender; this.sayhello = function() { console.log('您好,我是' + this.name); } } var p1 = creatPerson('joyce', 10, '男');
这样的函数有一个特点, 它就是为创建对象而存在的.
因此该方法( 函数 ) 常常被称为 工厂方法( 函数 )
但是工厂函数不方便与其他函数方法区分开来,并且用工厂创建对象的本质其实和字面量一样,
没有解决对象识别的问题
(4).构造函数(也是工作中最常用的)
this.name = name; this.age = age; this.gender = gender; this.sayhello = function() { console.log('您好,我是' + this.name); } } var p1 = new Person('joyce', 10, '男'); var p2 = new Person('jim', 9, '女');
-> 使用构造函数的方式来创建对象
1> 构造函数与普通函数类似. 唯一的不同是 约定 构造函数的名字采用 Pascal 命令规则.
2> 调用构造函数 采用语法 new 构造函数名()
3> 调用构造函数以后就是返回新创建的对象. 不需要写 return.
4> 在构造函数的内部使用 this 来表示刚创建的对象. 如果需要给对象提供成员使用 语法 this.XXX = XXX;
(5)原型模式
这里就不写了,会在面向对象程序设计中2 ,详细说明原型。
三.. 面向对象的基本特征
1. 抽象性
所谓的抽象性就是说只有在具体的环境中对象才可以表示具体的事物. 而在程序设计中实际只考虑对象的目标数据.
{ name, age, gender }
{ age, gender,爱好, 学习成绩等等 }
2.封装性
所谓封装性就是将具体的操作步骤打包起来, 那么不需要知道内部是如何处理的, 内部是多么的复杂, 只需要知道怎样用即可.
3.继承性
继承在 OOP 中表示的就是 扩展. 原来已经有一个对象了. 在其基础上又增加一些东西得到一个新的对象. 此时这个
新对象就是继承自原来的那个对象.
4.多态性( 了解 )
多态就是多种状态. 也就是说一个变量调用某一个方法. 得到的是不同的结果.