作者:狐狸家的鱼

本文链接:面向对象编程

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. vue中的tab栏切换内容变换

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

  2. Vue项目需求实现记录(永久更新)

    1.表单校验功能: 在el-form标签中定义:rules="rules";ref="reference" 在el-form-item定义prop=" ...

  3. Android 使用TextView实现跑马灯效果

    前言 我们在开发中经常会遇到一个小问题.比如下面一个小例子: 这个文字太长,单行中导致无法全部显示出来,这就是今天要实现的功能. 当然,百度中也有很多这种解决方案. 其中有一种,例如: <Tex ...

  4. SQL Server服务没有自动启动原因案例分析

    这个案例是前两天出现的,一直没有时间总结,25号凌晨4点去处理数据库的故障问题.远程连上公司的局域网,psping检查发现服务器的1433端口不通,数据库连接不上,但是主机又能ping通,登录服务器检 ...

  5. python带参函数(计算器脚本解释标注)

    环境 python 3.* def operator(op1,op2,opfu): #定义符号函数,op1表示第一个运算数值,op2表示第二个,opfu表示运算符号 if opfu not in '+ ...

  6. Microsoft Deployment Toolkit build 8456

    MDT build 8456的重大变化摘要. 支持的配置更新 Windows ADK for Windows 10,版本1809 Windows 10,版本1809 Configuration Man ...

  7. 我的Windows日常——Excel 打开.xls .xlsx 文件格式或文件扩展名无效

    就问下各位,这个图,熟不熟?!! 不熟? 好吧当我没问,遇到过的没遇到过的都让我继续写下去吧.... 很多时候,我们新建了一个word文件,但是打开却会弹出这个小窗口,新建的文件出现这个问题,是什么原 ...

  8. 解决在使用gensim.models.word2vec.LineSentence加载语料库时报错 UnicodeDecodeError: 'utf-8' codec can't decode byte......的问题

    在window下使用gemsim.models.word2vec.LineSentence加载中文维基百科语料库(已分词)时报如下错误: UnicodeDecodeError: 'utf-8' cod ...

  9. 是时候理解下HTTPS的原理及流程了

    1.什么是HTTP协议? HTTP协议是Hyper Text Transfer Protocol(超文本传输协议),位于TCP/IP模型当中的应用层.HTTP协议通过请求/响应的方式,在客户端和服务端 ...

  10. lower_bound( )和upper_bound( )的基本用法

    lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end.通过返回的地址减去起始地址 ...