面向对象编程(OPP)
作者:狐狸家的鱼
本文链接:面向对象编程
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- 数组的
map和forEach方法,运行提供一个函数作为参数。这个函数内部不应该使用this - 解决方法
- 1.
var that = this - 2.将
this当作forEach方法的第二个参数,固定它的运行环境
- 1.
- 数组的
- 避免回调函数中的
this
绑定this的方法
- Function.prototype.call()
- 可以指定函数内部
this的指向(即函数执行时所在的作用域),然后在所指定的作用域内,调用该函数 call方法的参数,应该是一个对象。如果参数为空、null、undefined,则默认传入全局对象call方法可以接受多个参数。第一个参数就是this所要指向的那个对象,后面的参数则是函数调用时所需的参数
- 可以指定函数内部
- Function.prototype.apply()
- 它与
call的唯一区别就是,它接收一个数组作为函数执行时的参数 apply方法的第一个参数也是this所要指向的那个对象,如果设为null或undefined,则等同于指定全局对象- 第二个参数则是一个数组,该数组的所有成员依次作为参数,传入原函数
- 原函数的参数,在
call方法中必须一个个添加,但是在apply方法中,必须以数组形式添加 - 应用
- 1.找出数组的最大元素:结合使用
apply方法和Math.max方法 - 2.将数组的空元素变为
undefined - 3.转换类似数组的对象:利用数组对象的
slice方法,可以将一个类似数组的对象(比如arguments对象)转为真正的数组 - 4.绑定回调函数的对象
- 1.找出数组的最大元素:结合使用
- 它与
- Function.prototype.bind()
- 用于将函数体内的
this绑定到某个对象,然后返回一个新函数 - 使用注意点
- 1.每一次返回一个新函数
- 2.结合回调函数使用
- 3.结合
call方法使用
- 用于将函数体内的
5.对象的继承
原型对象
构造函数的缺点是同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费。解决方法:使用prototype
prototype属性的作用就是:JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享原型对象的作用就是定义所有实例对象共享的属性和方法
原型链
由于原型对象也是对象,所以它也有自己的原型,对象到原型,再到原型的原型……
- 所有对象都继承了
Object.prototype的属性 Object.prototype的原型是null,原型链的尽头就是nullObject.getPrototypeOf方法返回参数对象的原型
constructor属性
prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数,可以被所有实例对象继承
面向对象编程(OPP)的更多相关文章
- 面向过程编程(OPP) 和面向对象编程(OOP)的关系
面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...
- python之面向对象编程
1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...
- python【第六篇】面向对象编程
面向对象编程 一.编程范式:编程的方法论.程序员编程的“套路”及“特点”特点总结,抽象成方法.规范. 二.面向对象编程介绍: 1.描述 世界万物,皆可分类:世间万物,皆为对象:只要是对象,就肯定属于某 ...
- C#入门经典第八章面向对象编程简介-1
面向对象编程(Object-Oriented Programming,OOP)技术 本章中的OPP实际上是.NET OOP,这里讲的一些技术不能应用于其他OOP环境.
- Python 面向对象编程详解
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- Go语言基础之面向对象编程中
1 Golang面向对象编程基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OPP语言不一样,随后分别介绍Golang对面向对象编程的三大特性是如何实现的. 2 ...
- 面向对象编程基础(java)
面向对象编程基础 1.1 面向对象概述 在程序开发初期,大家使用的是结构化开发语言,也就是面向过程(opp),但随着市场需求剧增,软件的规模也越来越大,结构化语言的弊端也暴露出来. 开发周期无休止的拖 ...
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
随机推荐
- java开发注解总结笔记
目录 1.最基础注解(spring-context包下的org.springframework.stereotype) 1.1.@Controller @Service @Repository @Co ...
- git操作常用命令
一.使用git 1.git是什么? Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己 ...
- css3 动画 总结
原来的时候写过一个小程序,里面有一个播放背景音乐的按钮(也是一个圆形的图片),它是一直在旋转的,当我们点击这个按钮的可以暂停或者播放背景音乐.当初的这个动画,是同事自己写的,我看到的时候以为是他在上面 ...
- h5与c3权威指南笔记--css3结构性伪类选择器root,not,empty,target
root:将样式绑定到根元素(html中的根元素是<html></html>) 举个栗子 :root{ background-color: yellow; } body{ ba ...
- 使用vue-cli快速搭建vue项目
直接上干货...... 步骤: 1.安装node.js:(下载地址:https://nodejs.org/en/download/)安装完成以后,在命令窗口输入node -v 查看node版本. ...
- Apache2配置多域名站点及支持https
0x00 预备条件 申请SSL证书 建立对应站点目录 开放443端口 0x01 配置sites-available文件 执行 vi /etc/apache2/sites-available/zecoc ...
- Dynamics 365-关于Solution的那些事(一)
关于CRM Solution,我准备写两到三篇的博客来做下介绍:包括一些基本信息,超大solution,还有增量更新solution操作等. CRM中的component,都是放在一个名叫Soluti ...
- Play vue.js with constant value in SailsJS
SailsJS supplies a utility module called parasails, which defines two elements, <ajax-form> an ...
- 数据结构java(一)数组链表
链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储. 相比c语言需要的结构体,在java中由于有了面向对象编程,将指针‘藏’了起来,不需要分配内存. 所以只需要创建一个对象 ...
- rocketmq批量消息投递
批量发送消息可提高传递小消息的性能.同时也需要满足以下特征 批量消息要求必要具有同一topic.相同消息配置 不支持延时消息 建议一个批量消息最好不要超过1MB大小 示例 小于1MB String t ...