JavaScript基础,面向对象编程(OOP)
文章目录
一、什么是面向对象编程
(1)、面向过程:专注于如何去解决一个问题的过程步骤。特点:由一个个的函数实现每一步的过程步骤,没有类和对象的概念(调用者需要自己去实现各种函数功能)。
(2)、面向对象:专注于由哪一个对象来解决这个问题。特点:出现了一个个的类,从类中拿到对象,有对象去解决这个问题(调用者只需知道对象中方法的功能即可,不需要知道方法的细节)
二、类和对象
(1)概念
类:包含了属性和方法的集合 eg:类名:人类 包含了 属性:身高、体重、性别 方法:吃饭、睡觉、打豆豆
对象:类中拿出具有明确的属性值和方法 eg:类名:张三 包含了 属性:180、65、男 方法:白米饭、在床上、脸上的豆
(2)关系
类是抽象的,对象是具体的(类是对象的抽象化,对象是类的具体化)
(3)使用方法:
①构造函数(创建类):大驼峰法则命名 function 类名(属性){}
②通过类实例化出一个对象:new 类名(属性值)
注意事项:
1、类名必须使用大驼峰法则
2、new 类名()叫做“类的实例化”
3、类中的this,会在实例化的时候指向新new出的对象 eg:this.sex : this是对象整体,sex是整体中的一部分
(4)重要属性
①constructor:
②instanceof:检测对象是不是这个类的实例(函数本身就是Object)
(5)广义对象和狭义对象
①:狭义对象:只有属性和方法(var obj = {} || var obj = new Object();)
②:广义对象:万物皆对象(基础类型除外)
三、成员属性和方法
- 成员属性/成员方法(实例属性/实例方法)1、在构造函数中用this.属性声明 2、实例化对象后用“对象.属性”追加的
- 属于由类new出的对象
- “对象名.属性名”调用
四、静态属性和静态方法
-
通过“类名.属性名”、“类名.方法名”声明的属性和方法(类属性和类方法)
-
属于构造函数
-
属于类
五、私有属性/方法、公有属性/方法
-
公有:
-
私有:
六、封装
-
什么是封装
①方法的封装:在类内部的私有方法,无法在类外部调用即为封装
②属性的封装:类中的属性私有化,不能“对象名.属性名”访问(设有get/set方法)
-
this指向
(1)、谁最终调用,this就指向谁
① this指向谁,不取决于this写在哪,而是取决于函数在哪里调用!!!
② this指向的永远只可能是对象,而不可能是函数!!!
③ this指向的对象,叫做函数的上下文context,也叫函数的调用者。(2)、this指向规律【五大准则】
①通过函数名()调用的,this永远指向window
②通过对象.方法调用的,this永远指向对象
③函数作为数组中的一个元素,用数组下标调用的,this指向这个数组
④函数作为window内置函数的回调函数使用,this指向window(setlnterval、setTimeout等)
⑤函数作为构造函数,使用new关键字调用,this指向新new出的对象
七、_proto _与prototype
-
prototype:函数的原型对象
①只有函数才有,而且必然有
②本身也是一个对象
③指向当前函数所在的引用地址
-
__ proto__:对象的原型
①只有对象才有,而且必然有
②本身也是一个对象,也有自己的__ proto__,顺着向上找就是原型链
③函数、数组都是对象,都有自己的__ proto__
-
实例化一个类,拿到对象的原理
实例化一个类,就是将新对象的__ proto__,指向构造函数所在的prototype:
-
所有对象的__ proto__沿原型链向上查找,都指向Object的prototype;Object的prototype原型指向null
八、原型链的指向问题
-
通过构造函数,new出的对象。新对象的__ proto__指向构造函数的prototype
-
函数的__ proto__,指向Function()的prototype
-
函数的prototype的__proto__指向Object的prototype
-
Object的prototype的__proto__,指向null
① 原型属性在定义后不能改变,无法在实例化是进行赋值。所以属性不能使用原型属性。
但是方法,写完以后基本不用改变,所以,方法可以使用原型方法。
② 实例化出对象后,属性全在对象上,方法全在原型上,结构清晰。
③ 使用for-in遍历对象时,会将方法和属性全部打印出来。
而方法往往不需要展示,那么讲方法写在原型上,就可以使用hasOwnProperty将原型方法过滤掉
④ 方法写到prototype上,将更加节省内存。