JS核心之封装继承多态(一)

83 阅读3分钟

简介

封装,继承和多态是面向对象编程的三步,面向对象编程,即先将数据封装在对象中,然后按需使用对象中的成员。

封装

创建一个对象集中保存一个事物的属性和功能,为后续数据的使用做准备,封装有利于大量数据的维护和使用

创建对象
简单创建:{}
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与函数定义无关,只与函数调用者有关。

对象特点
对象与关联数组

相同点:

  1. 都可用[“成员名”]或.成员名两种方式,访问自己的成员。

注:如成员名为变量,只能用[变量]形式访问,.后的值会默认为字符串。

  1. 都可以用for-in遍历。
  2. 都可用[“成员名”]或.成员名两种方式,添加成员。
  3. 访问数组或对象中不存在的位置,会返回undefined。

不同点:
类型不同,关联数组是数组对象家的孩子,对象是Object家中的,原型链不同。