JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解
前 言
JRedu
学过程序语言的都知道,我们的程序语言进化是从“面向机器”、到“面向过程”、再到“面向对象”一步步的发展而来。类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐渐淘汰;而面向过程的语言也只有C语言老大哥依然坚挺;现在主流的语言(例如Java、C++、PHP等)都是面向对象的语言。 而我们的JavaScript语言,恰恰介于面向过程与面向对象之间,我们称它为“基于对象”的语言。但是,JS中的OOP依然是我们学习JS的重要一环,当然像“继承”“封装”这样的面向对象特征,都是由模拟实现的。今天,我们就一起来探讨一下JS中的面向对象吧!
本章内容将详细介绍Android事件的具体处理及常见事件。
一、面向对象概述 |
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内创建类和对象代码示例
// ① 定义一个类(构造函数) function Person(name,age,sex){ // 类的属性 this.name = name; this.age = age; this.sex = sex; // 类的方法 this.say = function(){ alert("我叫"+this.name+";今年"+this.age+"岁;是一个"+this.sex+"生"); } } // 从类中,实例化出一个对象。并给对象的属性赋值 var zhangsan = new Person("张三",18,"男"); //zhangsan.say(); var lisi = new Person("李二狗",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五大准则)
首先,我们写这样的一个函数:
function func(){ 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指向这个数组
var arr = [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 = new func(); //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--->window var obj2 = { name:'obj1', arr:[func,1,2,3] } document.getElementById("div").onclick = obj2.arr[0](); // 函数最终调用者:数组下标 ,符合规律③ this--->arr var 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.prop var test = obj.prop.getFullname; console.log(test()); // John Doe // 函数最终调用者: 函数() window this-->window obj.func = obj.prop.getFullname; console.log(obj.func()); // this最终调用者是obj,所以this指向obj
好了,通过本篇博客,我们了解了什么是面向对象、类和对象的关系、JS中声明类与对象的步骤,以及重点讲解的this指向问题! 希望能够帮助大家真正的理解了this的认知,接下来的博客让我们继续探讨JavaScript的面向对象。
出处:http://www.cnblogs.com/jerehedu/
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:

JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解的更多相关文章
- OOP中this指向详解
谁调用了函数,this就指向谁 >>> this指向的永远只可能是对象!!! >>> this指向谁,永远不取决于this写在哪,而是取决于函数在哪调用!!! &g ...
- JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式
前 言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...
- 面向对象(OOP)--OOP基础与this指向详解
前 言 学过程序语言的都知道,我们的程序语言进化是从“面向机器”.到“面向过程”.再到“面向对象”一步步的发展而来.类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐 ...
- js插件---videojs中文文档详解
js插件---videojs中文文档详解 一.总结 一句话总结: js插件网上都有很多参考资料,使用起来也非常简单 二.lavarel中使用实例 <video id="example_ ...
- js实现的新闻列表垂直滚动实现详解
js实现的新闻列表垂直滚动实现详解:新闻列表垂直滚动效果在大量的网站都有应用,有点自然是不言而喻的,首先由于网页的空间有限,使用滚动代码可以使用最小的空间提供更多的信息量,还有让网页有了动态的效果,更 ...
- [概念] js的函数节流和throttle和debounce详解
js的函数节流和throttle和debounce详解:同样是实现了一个功能,可能有的效率高,有的效率低,这种现象在高耗能的执行过程中区分就比较明显.本章节一个比较常用的提高性能的方式,通常叫做&qu ...
- main.js index.html与app.vue三者关系详解
main.js index.html与app.vue三者关系详解 2019年01月23日 11:12:15 Pecodo 阅读数 186 main.js与index.html是nodejs的项目启 ...
- Javascript中prototype属性详解 (存)
Javascript中prototype属性详解 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...
- 【JavaScript中的this详解】
前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...
随机推荐
- Vue2.0 生产环境部署
简要:继上次搭建vue环境后,开始着手vue的学习;为此向大家分享从开发环境部署到生产环境(线上)中遇到的问题和解决办法,希望能够跟各位VUE大神学习探索,如果有不对或者好的建议告知下:*~*! 一. ...
- 奔跑在Docker上的Spark
转自:马踏飞燕--奔跑在Docker上的Spark 目录 为什么要在Docker上搭建Spark集群 网络拓扑 Docker安装及配置 ssh安装及配置 基础环境安装 Zookeeper安装及配置 H ...
- HTML中的行内元素和框元素详解
定义 传统的块级元素定义中只是说明了在文档流中形成了一个块,在前后加换行,这里有些笼统. 其实框元素是指宏观上的框元素,它包括3种类型:1.本身就是块级元素 2.dispaly被设置为类block 3 ...
- xdu_1064:Desolator in RA2
问题转化为,单个面积*2-交面积.下面求交面积.把直角坐标系中全部转90°,每个方块的坐标都做相应变化,这样会发现新的坐标系中空出了一部分方块,找规律发现,若求交矩形包含的方框数,其中恰好一半是前面空 ...
- python数据结构链表之单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- Hibernate 实体映射类的状态值自动转换
经常会遇到有些字段在数据库只是一个 byte 值,但是取出数据后需要转换为真实的状态名称. 举个栗子:一个图书管理系统,书籍有一个属性 stat(借出状态),在库中只需要保存一个 0/1/2/3/4 ...
- AmazeUI(妹子UI)中CSS组件、JS插件、Web组件的区别
AmazeUI(妹子UI)是非常优秀的国产前端UI,现在来介绍一下AmazeUI中CSS组件.JS插件与Web组件的区别. CSS组件顾名思义就是仅使用CSS渲染而成的组件,而JS插件也很容易理解,就 ...
- dubbo-zookeeper(续)
本篇为继上一篇的续篇,主要内容分为以下几点: 1.zookeeper集群 2.web管理平台 3.dubbo配置说明 接下来我们开始继续吧. 一.zookeeper集群 顾名思义也就是多台zookee ...
- Hadoop - 国内各站点最高温度、气压和风速统计
版权说明: 本文章版权归本人及博客园共同所有,转载请标明原文出处(http://www.cnblogs.com/mikevictor07/),以下内容为个人理解,仅供参考. 一.简介 该实例统计国内 ...
- ORACLE - 用户和角色的权限管理
在ORACLE中,创建用户后需要授权才能使用. 一.用户管理 1. 用户和角色信息查询 --查询所有用户 SQL> select * from dba_users; --经授予的用户或角色的系统 ...