作者:狐狸家的鱼

本文链接:面向对象编程

GitHub:sueRimn

面向对象编程(OPP)

具有灵活、代码可复用、高度模块化等特点,易维护和开发

实例对象与new命令

1.对象

  • 对象是单个实物的抽象
  • 对象是一个容器,封装了属性(prototype)和方法(method)
    • 属性是对象的状态
    • 方法是对象的行为

2.构造函数

JavaScript使用构造函数作为对象的模板,描述实例对象的基本结构

定义

  • 专门用来生成实例对象的函数
  • 第一个字母通常大写

特点

  • 函数体内部使用了this关键字,代表所要生成的对象实例
  • 生成对象的时候,必须使用new命令

3.new命令

基本用法

  • new命令的作用就是执行构造函数,返回一个实例对象

  • 根据需要,构造函数也可以接受参数 原理

  • 使用new命令时,它后面的函数依次执行下面的步骤

    • 1.创建一个空对象,作为将要返回的对象实例
    • 2.将这个空对象的原型,指向构造函数的prototype属性
    • 3.将这个空对象赋值给函数内部的this关键字
    • 4.开始执行构造函数内部的代码
  • 构造函数内部,this指的是一个新生成的空对象 new.target

    如果当前函数是new命令调用,new.target指向当前函数,否则为undefined

4.this关键字

涵义

  • 可以用在构造函数中,表示实例对象
  • 它总是返回一个对象
  • this就是属性或方法“当前”所在的对象
  • 由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的

使用场合

  • 全局环境:this指的就是顶层对象window
  • 构造函数:this指的是实例对象
  • 对象的方法:this指的就是方法运行时所在的对象

使用注意点

  • 避免多层this

    • 解决方法:使用一个固定this的值,然后内层函数调用这个变量 var that = this
  • 避免数组处理方法中的this
    • 数组的mapforEach方法,运行提供一个函数作为参数。这个函数内部不应该使用this
    • 解决方法
      • 1.var that = this
      • 2.将this当作forEach方法的第二个参数,固定它的运行环境
  • 避免回调函数中的this

绑定this的方法

  • Function.prototype.call()

    • 可以指定函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域内,调用该函数
    • call方法的参数,应该是一个对象。如果参数为空、nullundefined,则默认传入全局对象
    • call方法可以接受多个参数。第一个参数就是this所要指向的那个对象,后面的参数则是函数调用时所需的参数
  • Function.prototype.apply()
    • 它与call的唯一区别就是,它接收一个数组作为函数执行时的参数
    • apply方法的第一个参数也是this所要指向的那个对象,如果设为nullundefined,则等同于指定全局对象
    • 第二个参数则是一个数组,该数组的所有成员依次作为参数,传入原函数
    • 原函数的参数,在call方法中必须一个个添加,但是在apply方法中,必须以数组形式添加
    • 应用
      • 1.找出数组的最大元素:结合使用apply方法和Math.max方法
      • 2.将数组的空元素变为undefined
      • 3.转换类似数组的对象:利用数组对象的slice方法,可以将一个类似数组的对象(比如arguments对象)转为真正的数组
      • 4.绑定回调函数的对象
  • Function.prototype.bind()
    • 用于将函数体内的this绑定到某个对象,然后返回一个新函数
    • 使用注意点
      • 1.每一次返回一个新函数
      • 2.结合回调函数使用
      • 3.结合call方法使用

5.对象的继承

原型对象

构造函数的缺点是同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费。解决方法:使用prototype

prototype属性的作用就是:JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享原型对象的作用就是定义所有实例对象共享的属性和方法

原型链

由于原型对象也是对象,所以它也有自己的原型,对象到原型,再到原型的原型……

  • 所有对象都继承了Object.prototype的属性
  • Object.prototype的原型是null,原型链的尽头就是null
  • Object.getPrototypeOf方法返回参数对象的原型

constructor属性

prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数,可以被所有实例对象继承

面向对象编程(OPP)的更多相关文章

  1. 面向过程编程(OPP) 和面向对象编程(OOP)的关系

    面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...

  2. python之面向对象编程

    1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...

  3. python【第六篇】面向对象编程

    面向对象编程 一.编程范式:编程的方法论.程序员编程的“套路”及“特点”特点总结,抽象成方法.规范. 二.面向对象编程介绍: 1.描述 世界万物,皆可分类:世间万物,皆为对象:只要是对象,就肯定属于某 ...

  4. C#入门经典第八章面向对象编程简介-1

    面向对象编程(Object-Oriented Programming,OOP)技术 本章中的OPP实际上是.NET OOP,这里讲的一些技术不能应用于其他OOP环境.

  5. Python 面向对象编程详解

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  6. Go语言基础之面向对象编程中

    1 Golang面向对象编程基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OPP语言不一样,随后分别介绍Golang对面向对象编程的三大特性是如何实现的. 2 ...

  7. 面向对象编程基础(java)

    面向对象编程基础 1.1 面向对象概述 在程序开发初期,大家使用的是结构化开发语言,也就是面向过程(opp),但随着市场需求剧增,软件的规模也越来越大,结构化语言的弊端也暴露出来. 开发周期无休止的拖 ...

  8. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  9. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

随机推荐

  1. Python实例----------每日一贴

    def function_tips(): '''功能:每天输出一条励志文字 ''' import datetime # 导入日期时间类 # 定义一个列表 mot = ["今天星期一:\n人生 ...

  2. vue中的tab栏切换内容变换

    <!DOCTYPE html> <html lang="cn-zh"> <head> <meta charset="UTF-8& ...

  3. 深挖 NPM 机制

    使用NPM安装的时候会经常出现包冲突(比如多个主模块的子模块版本不一致等),导致在开发过程中会遇到各种或大或小的问题.所有在这会介绍以下内容: NPM 主要安装方式 NPM 包信息查询 NPM 安装机 ...

  4. Android远程桌面助手(B1391)

    ARDC(B1391), Download:https://files.cnblogs.com/files/we-hjb/ARDC%28B1391%29_EN.7z Android远程桌面助手(B13 ...

  5. Jmeter 接口测试实战-有趣的cookie

    Jmeter 接口测试实战-有趣的cookie 场景: 接口测试时常都需要登录,请求方式(post), 登录常用的方法有通过获取token, 获取session, 获取cookie, 等等. 这几种都 ...

  6. C,java,Python,这些名字背后的江湖!

    还记得高中的时候,有一次我们计算机老师问我们班要不要去参加市里面的C语言比赛,当时还小的我对编程世界压根就一片空白.那时候我就想啊,为什么是C语言,那么A语言,B语言或者是D语言又是什么呢? 后来就到 ...

  7. selenium-webdriver的二次封装(十)

    接着上篇随笔 selenium-配置文件定位元素 ,进行了配置文件设置后,将配置文件运用到定位元素中 思路:拿到定位的 key 和 value 后,对 webdrvier 中定位进行封装,使可以直接运 ...

  8. PostgreSQL10.1 linux 编译安装

    一 安装准备 1.首先从官网下载PostgreSQL压缩包(也可以使用yum安装),我们这里使用的是10.1的版本 2.将文件上传到linux服务区目录(我们这里放在/root 中) 3.解压缩 ta ...

  9. python接口自动化-json数据处理

    前言 有些post的请求参数是json格式的,需要导入json模块进行处理,json是一种数据交换格式,独立于编程语言 一般常见的接口返回数据也是json格式的,我们在做判断的时候,往往只需要提取其中 ...

  10. python+selenium运行时,提示元素不可见

    python+selenium运行多次新增项目脚本(出错的元素通过by_id的方式定位),当第三次新增时报Message: element not visible的错误,加入等待时间,等页面加载完成, ...