前  言

  学过程序语言的都知道,我们的程序语言进化是从“面向机器”、到“面向过程”、再到“面向对象”一步步的发展而来。类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐渐淘汰;而面向过程的语言也只有C语言老大哥依然坚挺;现在主流的语言(例如Java、C++、PHP等)都是面向对象的语言。 而我们的JavaScript语言,恰恰介于面向过程与面向对象之间,我们称它为“基于对象”的语言。但是,JS中的OOP依然是我们学习JS的重要一环,当然像“继承”“封装”这样的面向对象特征,都是由模拟实现的。今天,我们就一起来探讨一下JS中的面向对象吧!

一、面向对象概述

1.1面向过程与面向对象

  面向过程:专注于如何去解决一个问题的过程。编程特点是用一个个函数去实现过程操作,没有类与对象的概念;

  [举个栗子]

  当你想吃一个鸡蛋灌饼的时候,面向过程的思维需要你掌握购买食材、和面、烙饼、煎蛋等一系列的方法,然后按照顺序一个一个方法的去执行。

  面向对象:专注于有哪一个对象实体去解决这个问题。编程特点是:出现了一个个的类,由类去生成对象。

  [举个栗子]

  还是想吃鸡蛋灌饼,按照面向对象的思维,你需要去找一个买鸡蛋灌饼的阿姨,让他给你做一个。这时候,这个阿姨就是我们解决这个问题的对象。

1.2面向对象三大特征

  继承、封装、多态

1.3类&对象的关系

  ① 类:一群有相同特征(属性)和行为(方法)的集合。

  eg: 人类  属性:身高、体重、年龄   方法:吃饭、说话、敲代码

  ② 对象:从类中,拿出的具有确定属性值和方法的个体;

  eg: 张三  属性:身高180体重180方法:说话--我叫张三

  ③ 类和对象的关系:

  类是抽象的,对象是具体的。(类是对象的抽象化,对象是类的具体化)

  通俗的来讲:类是一个抽象的概念,表示具有相同属性和行为的集合,但是类仅仅表明这类群体具有相同的属性,但是没有具体的属性值。而对象是对类的属性进行具体赋值后,而得到的一个具体的个体;

  [举个栗子]

  人类有身高、体重、年龄,但是不能说人类的身高是多少。而张三,是人类的一个具体个体,身高、体重都有具体值,那么张三就是人类的一个对象

二、JavaScript中的面向对象

2.1创建类和对象的步骤

  ① 创建一个类(构造函数)。 类名,必须要每个单词的首字母都大写

funtion 类名(属性一){this.属性=属性一;this.方法=function(){}//this指向谁? -- 即将调用当前构造函数的对象。
}

  ② 通过类,实例化出一个新的对象;

var obj =new类名(属性一的Value);//原构造函数中this,指向新创建的obj对象;
obj.方法(); 调用方法
obj.属性; 调用属性

2.2内创建类和对象代码示例

//① 定义一个类(构造函数)

functionPerson(name,age,sex){//类的属性this.name =name;this.age =age;this.sex =sex;//类的方法this.say =function(){alert("我叫"+this.name+";今年"+this.age+"岁;是一个"+this.sex+"生");}}//从类中,实例化出一个对象。并给对象的属性赋值var zhangsan =newPerson("张三",18,"男");//

zhangsan.say();var lisi =newPerson("李二狗",16,"男");//

lisi.say();

三、JavaScript中的this指向问题

  在上一部分中,我们创建了一个类,并通过这个类new出了一个对象。 但是,这里面出现了大量的this。 很多同学就要懵逼了,this不是“这个”的意思吗?为什么我在函数里面写的this定义的属性,最后到了函数new出的对象呢??

  今天,就让我们拨开迷雾,牢牢记住“杰小瑞this五大准则”。帮你缕清关于JS中this指向的一切谜团。

3.1谁最终调用函数,this指向谁

  首先来明白this指向的基本概念,“this永远指向函数的最终调用者”,理解这句话,我们先明确三个基本要素:

  ①this指向的,永远只可能是对象!!!!!!

  ②this指向谁,永远不取决于this写在哪!!而是取决于函数在哪调用。

  ③this指向的对象,我们称之为函数的上下文context,也叫函数的调用者

  可能有同学要说了,我明确了这三个要素了,我也看不懂this的指向啊。var obj = new function();第二部分的这句话,怎么就让函数(类)中的this指向obj了啊?一脸懵逼ing。。。

  那么,接下来,就让我们祭出“杰小瑞this五大法宝”吧!记住这5条,所有this指向手到擒来!

3.2※※※this指向的规律(杰小瑞this五大准则)

  首先,我们写这样的一个函数:

functionfunc(){

  console.log(this);

}

  Question:请问this指向谁?

  如果面试有人这么问你!你可以直接甩他一个大嘴巴!然后大声告诉他“this指向谁,取决于谁调用函数!而不取决于函数写在哪里!只有函数声明,没有函数调用语句。我不知道this指向谁!”

  然后,面试官一定会捂着脸告诉你,“你被录用了/(ㄒoㄒ)/~~”

  哈哈,开完玩笑,我们来研究一下,下面那个函数中的this,到底有可能指向谁?杰小瑞老师总结了5大准则,一起来看看吧~~

  ①通过函数名()直接调用:this指向window

func();//this--->window
//【解释】 我们直接用一个函数名()调用,函数里面的this,永远指向window。

  ② 通过对象.函数名()调用的:this指向这个对象

//狭义对象var obj ={name:"obj",func1 :func};obj.func1();//this--->obj//【解释】我们将func函数名,当做了obj这个对象的一个方法,然后使用对象名.方法名, 这时候函数里面的this指向这个obj对象。//广义对象

document.getElementById("div").onclick =function(){this.style.backgroundColor = "red";};//this--->div//【解释】对象打点调用还有一个情况,我们使用getElementById取到一个div控件,也是一种广义的对象,用它打点调用函数,则函数中的this指向这个div对象。

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

vararr = [func,1,2,3];arr[0]();//this--->arr//【解释】这个,我们把函数名,当做数组中的一个元素。使用数组下标调用,则函数中的this将指向这个数组arr。

  ④ 函数作为window内置函数的回调函数调用:this指向window

setTimeout(func,1000);//this--->window//setInterval(func,1000);//【解释】使用setTimeout、setInterval等window内置函数调用函数,则函数中的this指向window。

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

var obj =newfunc();//this--->new出的新obj//【解释】这个就是第二部分我们使用构造函数new对象的语句,将函数用new关键字调用,则函数中的this指向新new出的对象。

3.3综合小练习

没学得会,练习来校对!上述的五大准则你理解了吗?让我们来做几个小练习吧?看看这些this都是指向谁?

var obj1 ={name:'obj1',arr:[setTimeout(func,3000),1,2,3]}document.getElementById("div").onclick = obj1.arr[0]; //函数最终调用者:setTimeout ,符合规律⑤ this--->windowvar obj2 ={name:'obj1',arr:[func,1,2,3]}document.getElementById("div").onclick = obj2.arr[0]();//函数最终调用者:数组下标 ,符合规律③ this--->arrvar obj3 ={name:'obj1',arr:[{name:'arrObj',fun:func},1,2,3]}document.getElementById("div").onclick = obj3.arr[0].fun();//函数最终调用者:{name:'arrObj',fun:func} ,符合规律② this--->obj

3.4模拟面试题

小练习都做出来了吗?不要骄傲哦~~来看一套模拟面试题吧!!下面的打印语句都应该是什么结果呢?先不要看答案,自己做一下吧~

var fullname = 'John Doe';var obj ={fullname:'Colin Ihrig',prop: {fullname:'Aurelio De Rosa',getFullname:function() {return this.fullname;}}};var arr = [obj.prop.getFullname,12,3,4,5];console.log(arr[0]());/ /this指向数组,数组没有fullname属性,所以未定义!

console.log(obj.prop.getFullname());//Aurelio De Rosa//函数最终调用者:obj.prop  this--->obj.propvartest =obj.prop.getFullname;

console.log(test());//John Doe//函数最终调用者: 函数() window  this-->windowobj.func =obj.prop.getFullname;

console.log(obj.func());//this最终调用者是obj,所以this指向obj

好了,通过本篇博客,我们了解了什么是面向对象、类和对象的关系、JS中声明类与对象的步骤,以及重点讲解的this指向问题! 希望能够帮助大家真正的理解了this的认知,接下来的博客让我们继续探讨JavaScript的面向对象。

转载于:https://www.cnblogs.com/qdjianghao/p/10177360.html

JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解相关推荐

  1. java获取10位随机数_Java基础:JAVA中BitSet使用详解

    适用场景:整数,无重复: Bitset 基础 Bitset,也就是位图,由于可以用非常紧凑的格式来表示给定范围的连续数据而经常出现在各种算法设计中.上面的图来自c++库中bitset的一张图. 基本原 ...

  2. computed用发_Vue.js中computed使用详解

    这次给大家带来Vue.js中computed使用详解,Vue.js中computed使用的注意事项有哪些,下面就是实战案例,一起来看一下. JS属性: JavaScript有一个特性是Object.d ...

  3. js some every数组方法的区别与详解

    js some every数组方法的区别于详解 前言 一.some方法 二.every() 方法 总结 前言 在开发中对数组数据的常规操作我们会经常遇到一些必要的操作 例如:要检测数组中的元素是否满足 ...

  4. js路由在php上面使用,React中路由使用详解

    这次给大家带来React中路由使用详解,React中路由使用的注意事项有哪些,下面就是实战案例,一起来看一下. 路由 通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-r ...

  5. js 正则中冒号代表什么_javascript中正则表达式语法详解

    好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉.就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要 ...

  6. Linux 创建网页服务,Linux使用Node.js建立访问静态网页的服务实例详解

    Linux使用Node.js建立访问静态网页的服务实例详解 一.安装node.js运行所需要的环境,: 二.创建node目录(/node/www),并在目录下创建node.js服务文件server.j ...

  7. 微信公众平台菜单编辑php,Vue.js实现微信公众号菜单编辑器步骤详解(上)

    这次给大家带来Vue.js实现微信公众号菜单编辑器步骤详解(上),Vue.js实现微信公众号菜单编辑器的注意事项有哪些,下面就是实战案例,一起来看一下. 学习一段时间Vue.js,于是想尝试着做一个像 ...

  8. JS逆向之补环境过瑞数详解

    JS逆向之补环境过瑞数详解 "瑞数" 是逆向路上的一座大山,是许多JS逆向者绕不开的一堵围墙,也是跳槽简历上的一个亮点,我们必须得在下次跳槽前攻克它!! 好在现在网上有很多讲解瑞数 ...

  9. JS比较运算符之等于与不等于详解

    [align=center]JS比较运算符之等于与不等于详解[/align] [b]1.1等于(==)与不等于(!=)[/b] 使用==或!=来比较两个数据是否相等,如果两个数据的类型不同,将进行转换 ...

最新文章

  1. “年轻”有价值,才是本钱
  2. sogou ubuntu安装(最后还是失败了,最近老失败,不知道为啥)
  3. Mr.J-- jQuery学习笔记(十一)--事件委托
  4. 书------操作系统(2000)
  5. 小米手机将终结卡顿?未来所有机型将升级新MIUI
  6. 【Java】application run failed Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and
  7. 第一章:T-SQL查询与编程基础
  8. scrapy 在迭代爬取时被拒 offsite 增加dont_filter=True
  9. UI动画的一些制作过程
  10. 大数据shipin教程_大数据全套视频教程完整版
  11. 数字通信系统相关基本概念(一)
  12. 网页前端设计之多选按钮
  13. Hudi-Flink CDC将MySQL数据写入hudi
  14. 双目视觉-双目测距原理剖析
  15. 快递100快递实时快递查询接口API案例代码
  16. python抓取图片数字_python 实现识别图片上的数字
  17. 决策树和 K 近邻分类
  18. 如何修炼java内功
  19. 性能测试:一种计算 TP90、TP95 和 TP99 等水位线的方法
  20. 如何区分IO密集型、CPU密集型任务?

热门文章

  1. MVC通过ViewBag动态生成Html输出到View
  2. PHP求并集,交集,差集
  3. WPF模板(二)应用
  4. C++学习笔记第二天:几个知识点
  5. Property list types and their various representations
  6. Codeforces 432E Square Tiling(结构体+贪婪)
  7. android获取string.xml的值(转)
  8. MySQL5.6开启慢查询
  9. Spark学习之路 (十五)SparkCore的源码解读(一)启动脚本
  10. * 星号的居中 文本处理样式的总结