简介
封装,继承和多态是面向对象编程的三步,面向对象编程,即先将数据封装在对象中,然后按需使用对象中的成员。
封装
创建一个对象,集中保存一个事物的属性和功能,为后续数据的使用做准备,封装有利于大量数据的维护和使用。
创建对象
简单创建:{}
var 对象名 = {
属性名1: 值2,
属性名2: 值2,
...: ...
方法名1: function(){
}
...: ...
}
仿数组创建:new
- 构建空对象:var 对象名 = new Object;
- 添加新属性:obj.属性名 = 属性值;
- 添加新方法:obj.方法名 = function(){…};
注:js对象实际上类似一个关联数组。当在创建对象时,对象内信息不明确时可用此方法。
构造函数创建:new 类型名(属性值1,…)
- 定义一个构造函数,用来描述一类对象的同一结构。
function 类型名(形参1,...){
this.属性名=形参1;
... = ... ;
this.方法名=function(){
}
}
- 调用构造函数创建对象
var obj=new 类型名(属性值1,...);
注:构造函数其实是仿数组构建法的变体,当需要反复创建多个相同结构的对象时,可用构造函数将相同结构保存起来,可以通过调用函数实现代码重用。
访问对象
访问对象属性:对象名.属性名
属性就是保存在对象中的变量,要找到属性,得先找到对象,再用.操作符,进入对象中,访问属性。
访问对象方法:对象名.方法()
方法就是保存在对象中的函数,先找到对象,再用.操作符,进入对象中,找到内部的方法加()调用。
内部访问属性:this.属性名
在对象方法中,直接使用属性名无法访问到自己的属性值,会报错: 属性名未定义。
属性就是保存在对象中的变量,默认在作用域链中查找,作用域链包含临时函数作用域和window作用域,对象的{}并不是作用域,不包含在作用链中,故即使在对象内部,对象内的属性也无法被直接找到。只能使用对象名.属性名进行访问。
一般来说,为了避免紧耦合,我们在内部访问的时候使用this.属性名代替对象名.属性名,防止因外部改变带来的不变,this可以动态的指向调用者,当使用对象名.方法()调用对象方法时,方法中的this将自动指向“.”前的调用者,被替换为对象名。
注: this与函数定义无关,只与函数调用者有关。
对象特点
对象与关联数组
相同点:
- 都可用[“成员名”]或.成员名两种方式,访问自己的成员。
注:如成员名为变量,只能用[变量]形式访问,.后的值会默认为字符串。
- 都可以用for-in遍历。
- 都可用[“成员名”]或.成员名两种方式,添加成员。
- 访问数组或对象中不存在的位置,会返回undefined。
不同点:
类型不同,关联数组是数组对象家的孩子,对象是Object家中的,原型链不同。