作者:狐狸家的鱼

本文链接:面向对象编程

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. shiro缓存管理

    一. 概述 Shiro作为一个开源的权限框架,其组件化的设计思想使得开发者可以根据具体业务场景灵活地实现权限管理方案,权限粒度的控制非常方便.首先,我们来看看Shiro框架的架构图:从上图我们可以很清 ...

  2. C#实现多级子目录Zip压缩解压实例

          参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩,类似winrar,可以选择 ...

  3. 一种动态写入apk数据的方法(用于用户关系绑定、添加渠道号等)

    背景: 正在开发的APP需要记录业务员与客户的绑定关系.具体应用场景如下: 由流程图可知,并没有用户填写业务人员信息这一步,因此在用户下载的APP中就已经携带了业务人员的信息. 由于业务人员众多,不可 ...

  4. Android Monkey压力测试使用

    一.Monkey简介: Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击.滑动.Application切换.横竖屏.应用关闭)实现对 ...

  5. AsyncTask机制

    AsyncTask可以让我们更容易地使用UI线程.它允许执行后台操作,并把结果发布到UI线程上,而不需要操作线程或Handler.AsyncTask被设计成一个和Thread.Handler相关的一个 ...

  6. Java:API文档;文档注释中的javadoc标记;官方API;自己动手给项目建一个API文档

    1.什么是API文档 在Java语言中有3种注释 //单行注释 /* 多行注释 */ /** * 文档注释 */ API(应用程序接口)文档就是用javadoc命令提取文档注释生成的,html格式,用 ...

  7. maven pom 属性介绍

    maven pom属性 内置属性(预定义,可直接使用) ${basedir} 表示项目根目录,即包含pom.xml文件的目录; ${version} 表示项目版本; ${project.basedir ...

  8. MySQL数据库在IO性能优化方面的设置选择(硬件)

    提起MySQL数据库在硬件方面的优化无非是CPU.内存和IO.下面我们着重梳理一下关于磁盘I/O方面的优化. 1.磁盘冗余阵列RAID RAID(Redundant Array of Inexpens ...

  9. C# Dictionary 函数解析及使用方法

    要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib)  Dictionary的描述 1.从一组键(Key)到一组值 ...

  10. cvc-elt.1: Cannot find the declaration of element 'beans'Failed to read schema document 'http://www.springframework.org/schema/beans/spring- beans-3.0.xsd'

    Multiple annotations found at this line: - cvc-elt.1: Cannot find the declaration of element 'beans' ...