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

前  言

学过程序语言的都知道,我们的程序语言进化是从“面向机器”、到“面向过程”、再到“面向对象”一步步的发展而来。类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐渐淘汰;而面向过程的语言也只有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指向谁? -- 即将调用当前构造函数的对象。}

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

varobj =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+"生");

}

}//从类中,实例化出一个对象。并给对象的属性赋值varzhangsan =newPerson("张三",18,"男");//zhangsan.say();varlisi =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指向这个对象

//狭义对象varobj ={

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出的对象

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

3.3综合小练习

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

varobj1 ={

name:'obj1',

arr:[setTimeout(func,3000),1,2,3]

}

document.getElementById("div").onclick = obj1.arr[0];//函数最终调用者:setTimeout ,符合规律⑤ this--->windowvarobj2 ={

name:'obj1',

arr:[func,1,2,3]

}

document.getElementById("div").onclick = obj2.arr[0]();//函数最终调用者:数组下标 ,符合规律③ this--->arrvarobj3 ={

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模拟面试题

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

varfullname = 'John Doe';varobj ={

fullname:'Colin Ihrig',

prop: {

fullname:'Aurelio De Rosa',

getFullname:function() {returnthis.fullname;

}

}

};vararr = [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的面向对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容