面向对象就是使用对象。面向对象开发就是使用对象开发。
面向过程就是用过程的方式进行开发。面向对象是对面向过程的封装。
1.2 三大特性抽象性
所谓的抽象性就是:如果需要一个对象描述数据,需要抽取这个对象的核心数据
提出需要的核心属性和方法
不在特定的环境下无法明确对象的具体意义
封装性
对象是将数据与功能组合到一起,即封装
JS对象就是键值对的集合,键值如果是数据(基本数据、符合数据、空数据)就称为属性,如果键值是函数那么就称为方法
对象就是将属性与方法封装起来
方法是将过程封装起来
继承性
所谓继承性就是自己没有但是别人有,拿过来成为自己的,就是继承,继承是实现复用的一种手段
在Java等语言中继承满足一个class的规则,类是一个class,他规定了一个对象有什么属性和方法。
在这些语言中继承是class之间的继承,一个class继承另一个class,那么该class就有了另一个class的成员,那么由该class创建出来的对象就同时具有两个class的成员。
在JS中没有明确的继承语法(ES6提供了class extend语法),一般都是按照继承的理念实现对象的成员扩充实现继承,因此JS中实现继承的方法非常对多。
传统继承基于类,JS继承基于对象
一个简单的继承模式:混入(mix)
function mix ( o1, o2 ) { for ( var k in o2 ) { o1[ k ] = o2[ k ]; } }
1.3 关于面向对象的一些其他概念类class:在JS中就是构造函数
在传统的面向对象语言中,使用一个叫类的东西定义模板,然后使用模板创建对象。
在构造方法中也具有类似的功能,因此也称其为类
实例(instance)与对象(object)
实例一般是指某一个构造函数创建出来的对象,我们称为XXXX 构造函数的实例
实例就是对象。对象是一个泛称
实例与对象是一个近义词
键值对与属性和方法
在JS中键值对的集合称为对象
如果值为数据(非函数),就称该键值对为属性
如果值为函数(方法),就称该键值对为方法method
父类与子类(基类和派生类)
传统的面向对象语言中使用类来实现继承那么就有父类、子类的概念
父类又称为基类,子类又称为派生类
在JS中没有类的概念,在JS中常常称为父对象,子对象,基对象,派生对象。
二、构造函数 2.1 构造函数是干什么用的初始化数据的
在JS中给对象添加属性用的,初始化属性值用的
2.2 创建对象的过程代码:var p = new Person();
首先运算符new创建了一个对象,类似于{},是一个没有任何(自定义)成员的对象。
使用new 创建对象,那么对象的类型就是创建他的构造函数名
使用{}无论如何都是Object类型,相当于new Object
然后调用构造函数,为其初始化成员
构造函数在调用的一开始,有一个赋值操作,即this = 刚刚创建出来的对象。
因此在构造函数中this表示刚刚创建出来的对象。
在构造函数中 利用 对象的动态特性 为其对象添加成员。
三、作用域 3.1 什么是作用域域表示的就是范围,即作用域,就是一个名字在什么地方可以使用,什么时候不能使用。
简单的说,作用域是针对变量的,比如我们创建一个函数 a1,函数里面又包了一个子函数 a2。
// 全局作用域 functiona a1() { // a1作用域 function a2() { // a2作用域 } }
此时就存 在三个作用域:全局作用域,a1 作用域,a2 作用域;即全局作用域包含了 a1 的作用域,a2 的作用域包含了 a1 的作用域。
当 a2 在查找变量的时候会先从自身的作用域区查找,找不到再到上一级 a1 的作用域查找,如果还没找到就
到全局作用域区查找,这样就形成了一个作用域链。
函数允许访问函数外部的数据
整个代码结构中只有函数可以限定作用域
作用规则首先使用提升规则分析
如果当前作用域中有了名字了,就不考虑外面的名字
3.3 属性搜索原则所谓的属性搜索原则,就是对象在访问属性或方法的时候,首先在当前对象中查找
如果当前对象中存储着属性或方法,停止查找,直接使用该属性或方法
如果当前对象没有该成员,那么再在其原型对象中查找
如果原型对象中含有该成员,那么停止查找,直接使用
如果原型中还没有,就到原型的原型中查找
如此往复,直到Object.protitype还没有,那么就返回undefined
如果是调用方法就报错,该xxx不是一个函数
四、闭包 4.1 说说你对闭包的理解