JavaScript基础,面向对象编程(OOP)

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出的对象
  • “对象名.属性名”调用

四、静态属性和静态方法

  • 通过“类名.属性名”、“类名.方法名”声明的属性和方法(类属性和类方法)

  • 属于构造函数

  • 属于类

    在这里插入图片描述

五、私有属性/方法、公有属性/方法

  • 公有:在这里插入图片描述

  • 私有:

六、封装

  1. 什么是封装

    ​ ①方法的封装:在类内部的私有方法,无法在类外部调用即为封装

    ​ ②属性的封装:类中的属性私有化,不能“对象名.属性名”访问(设有get/set方法)

  2. this指向

    (1)、谁最终调用,this就指向谁

    ​ ① this指向谁,不取决于this写在哪,而是取决于函数在哪里调用!!!
       ② this指向的永远只可能是对象,而不可能是函数!!!
       ③ this指向的对象,叫做函数的上下文context,也叫函数的调用者。

    (2)、this指向规律【五大准则】

    ​ ①通过函数名()调用的,this永远指向window

    在这里插入图片描述

    ​ ②通过对象.方法调用的,this永远指向对象

    在这里插入图片描述

    ​ ③函数作为数组中的一个元素,用数组下标调用的,this指向这个数组

    在这里插入图片描述

    ​ ④函数作为window内置函数的回调函数使用,this指向window(setlnterval、setTimeout等)

    在这里插入图片描述

    ​ ⑤函数作为构造函数,使用new关键字调用,this指向新new出的对象

    在这里插入图片描述

七、_proto _与prototype

  1. prototype:函数的原型对象

    ​ ①只有函数才有,而且必然有

    ​ ②本身也是一个对象

    ​ ③指向当前函数所在的引用地址

  2. __ proto__:对象的原型

    ​ ①只有对象才有,而且必然有

    ​ ②本身也是一个对象,也有自己的__ proto__,顺着向上找就是原型链

    ​ ③函数、数组都是对象,都有自己的__ proto__

  3. 实例化一个类,拿到对象的原理

    ​ 实例化一个类,就是将新对象的__ proto__,指向构造函数所在的prototype:

    在这里插入图片描述

  4. 所有对象的__ proto__沿原型链向上查找,都指向Object的prototype;Object的prototype原型指向null

八、原型链的指向问题

  1. 通过构造函数,new出的对象。新对象的__ proto__指向构造函数的prototype

    在这里插入图片描述

  2. 函数的__ proto__,指向Function()的prototype

  3. 函数的prototype的__proto__指向Object的prototype

  4. Object的prototype的__proto__,指向null
    在这里插入图片描述

① 原型属性在定义后不能改变,无法在实例化是进行赋值。所以属性不能使用原型属性。
 但是方法,写完以后基本不用改变,所以,方法可以使用原型方法。
② 实例化出对象后,属性全在对象上,方法全在原型上,结构清晰。
③ 使用for-in遍历对象时,会将方法和属性全部打印出来。
 而方法往往不需要展示,那么讲方法写在原型上,就可以使用hasOwnProperty将原型方法过滤掉
④ 方法写到prototype上,将更加节省内存。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值