JavaScript面向对象与this指向(附代码)

这次给大家带来JavaScript面向对象与this指向(附代码),使用JavaScript面向对象与this指向的注意事项有哪些,下面就是实战案例,一起来看一下。

我们的程序语言经历了从“面向机器”、到“面向过程”、再到“面向对象”的一个过程。而JavaScript是一门基于对象的一门语言,它介于面向过程与面向对象之间。在学习JavaScript的过程中,OOP是非常重要的一环,下面我们来一起探讨一下JS中的面向对象吧!!!

1 、OOP的基础问题

1.1什么是面向过程和面向对象?

面向过程:专注于如何去解决一个问题的过程步骤。编程特点是由一个个的函数去实现每一步的过程步骤,没有类和对象的概念。

面向对象:专注于由哪一个对象来解决这个问题。编程特点是出现了一个个的类,从类中拿到这个对象,由这个对象去解决具体的问题。

对于调用者来说,面向过程需要调用者自己去实现各种函数。而面向对象,只需要告诉调用者对象中具体方法的功能,而不需要调用者了解方法中的实现细节。

1.2面向对象的三大特征

继承、封装、多态

1.3类和对象的关系

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

比如:人类–>属性:身高、体重、性别 方法:吃饭、说话、走路

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

比如:张三–>属性:身高180、体重180 方法:说话–>我叫张三,身高180

③ 类和对象的关系

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

解释一下:

类是一个抽象的概念,只能说类有属性和方法,但是不能给属性赋具体的值。比如说人类有姓名,但是不能说人类的姓名叫啥。。。

对象是一个具体的个例,是将类中的属性进行具体赋值而来的个体。比如说张三是人类的一个个体,可以说张三的姓名叫张三。也就是张三对人类的每一个属性进行了具体的赋值,那么张三就是由人类产生的一个对象。

2、 JavaScript中的面向对象

2.1创建类和对象的步骤

①创建一个类(构造函数):类名必须使用大驼峰法则,即每个单词的首字母必须大写。

function 类名(属性1){  this.属性1 = 属性1;  this.方法 = function(){   //方法中要调用自身属性,必须要使用this.属性  }}

登录后复制

②通过类,实例化(new)出一个对象。

var obj = new 类名(属性1的具体值);

obj.属性; 调用属性

obj.方法(); 调用方法

③注意事项

>>>通过类名,new出一个对象的过程,叫做“类的实例化”

>>>类中的this,会在实例化的时候,指向新new出的对象。所以,this.属性 this.方法,实际上是将属性和方法绑定在即将new出的对象上面。

>>>在类中,要调用自身属性,必须使用this.属性名、如果直接使用变量名,则无法访问对应的属性。

>>>类名必须使用大驼峰法则,注意与普通函数的区别。

2.2两个重要属性constructor和instanceof

①constructor:返回当前对象的构造函数

>>>zhangsan.constructor = Person; √

②instanceof:检测一个对象,是不是一个类的实例;

>>>lisi instanceof Person √ lisi是通过Person类new出的

>>>lisi instanceof Object √ 所有对象都是Object的实例

>>>Person instanceof Object √ 函数本身也是对象

3、 JavaScript中的this指向问题

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

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

① this指向谁,不应该考虑函数在哪声明,而应该考虑函数在哪调用!!

② this指向的,永远只可能是对象,不可能是函数!!

③ this指向的对象,叫做函数的上下文context,也叫函数的调用者。

3.2this指向的规律(与函数的调用方式息息相关!)

① 通过函数名()调用的,this永远指向window

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

登录后复制

② 通过对象.方法调用的,this指向这个对象

// 狭义对象 var obj = {  name:"obj",  func1 :func }; obj.func1(); // this--->obj//【解释】我们将func函数名,当做了obj这个对象的一个方法,然后使用对象名.方法名, 这时候函数里面的this指向这个obj对象。 // 广义对象 document.getElementById("p").onclick = function(){  this.style.backgroundColor = "red";}; // this--->p//【解释】对象打点调用还有一个情况,我们使用getElementById取到一个p控件,也是一种广义的对象,用它打点调用函数,则函数中的this指向这个p对象。

登录后复制

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

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

登录后复制

④ 函数作为window内置函数的回调函数使用,this指向window。比如setTimeout、setInterval等

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 fullname = 'John Doe';var obj = {  fullname: 'Colin Ihrig',  prop: {    fullname: 'Aurelio De Rosa',    getFullname: function() {      return this.fullname;    }  }};console.log(obj.prop.getFullname()); // 函数的最终调用者 obj.prop    var test = obj.prop.getFullname;console.log(test()); // 函数的最终调用者 test() this-> window   obj.func = obj.prop.getFullname;console.log(obj.func()); // 函数最终调用者是obj   var arr = [obj.prop.getFullname,1,2];arr.fullname = "JiangHao";console.log(arr[0]());// 函数最终调用者数组

登录后复制

好了,这篇博客,我们了解了什么是面向对象、类和对象的关系、JS中声明类与对象的步骤,以及重点讲解的this指向问题! 希望能够帮助大家真正的理解了this的认知,下面我会继续给大家分享关于面向对象方面的问题。多谢大家的支持!!!

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

Vue中computed属性的使用方法

ajax与跨域jsonp

以上就是JavaScript面向对象与this指向(附代码)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2771388.html

(0)
上一篇 2025年3月8日 12:56:43
下一篇 2025年3月8日 12:56:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 原生JS做出一个音乐播放器

    这次给大家带来原生JS做出一个音乐播放器,原生JS做出一个音乐播放器的注意事项有哪些,下面就是实战案例,一起来看一下。 前  言          最近在复习JS,觉得音乐播放器是个挺有意思的东西,今天就来用我们最原生的JS写一个小小的音乐…

    编程技术 2025年3月8日
    100
  • 在JS中实现继承有哪几种方式

    这次给大家带来在JS中实现继承有哪几种方式,在JS中实现继承的注意事项有哪些,下面就是实战案例,一起来看一下。 我们都知道,面向对象的三大特征——封装、继承、多态。 封装无非就是属性和方法的私有化,所以我们JS中提供了私有属性和私有方法。 …

    编程技术 2025年3月8日
    200
  • JS中多态使用详解

    这次给大家带来JS中多态使用详解,JS中多态使用的注意事项有哪些,下面就是实战案例,一起来看一下。  多态在面向对象编程语言中是十分重要的。在JAVA中是通过继承来得到多态的效果。如下: public abstract class Anim…

    编程技术 2025年3月8日
    200
  • vue.js渐进式框架使用详解

    这次给大家带来vue.js渐进式框架使用详解,vue.js渐进式框架使用详解的注意事项有哪些,下面就是实战案例,一起来看一下。 Vue.js是一套构建用户界面(user interface)的渐进式框架。与其他重量级框架不同的是,Vue 从…

    编程技术 2025年3月8日
    200
  • JS使用indexOf()方法实现数组去重

    这次给大家带来js使用indexof()方法实现数组去重,js使用indexof()方法实现数组去重的注意事项有哪些,下面就是实战案例,一起来看一下。 var arr = [‘abc’,’abcd’,’sss’,’2′,’d’,’t’,’2…

    编程技术 2025年3月8日
    200
  • 使用JS实现表单验证(附代码)

    这次给大家带来使用JS实现表单验证(附代码),使用JS实现表单验证的注意事项有哪些,下面就是实战案例,一起来看一下。 表单验证 function checkusername() { var myform = document.getElem…

    编程技术 2025年3月8日
    200
  • 用JS的定时器实现进度条

    这次给大家带来用JS的定时器实现进度条,用JS的定时器实现进度条的注意事项有哪些,下面就是实战案例,一起来看一下。 Javascript 中的定时器 window度一线下面的方法 window.setInterval() 启动定时器 1.s…

    编程技术 2025年3月8日
    200
  • JS上传文件时显示进度条

    这次给大家带来js上传文件时显示进度条,js上传文件时显示进度条的注意事项有哪些,下面就是实战案例,一起来看一下。 在php.ini修改需要的大小: upload_max_filesize = 8M    post_max_size = 1…

    编程技术 2025年3月8日
    200
  • JS实现去重的随机数生成

    这次给大家带来JS实现去重的随机数生成,JS实现去重随机数生成的注意事项有哪些,下面就是实战案例,一起来看一下。 1.实验前准备: Math函数的理解 数组方法的理解 2.实验操作: 随机数生成 body{font-size: 20px;}…

    编程技术 2025年3月8日
    200
  • 用AngualrJs使用定时器

    这次给大家带来用AngualrJs使用定时器,用AngualrJs使用定时器的注意事项有哪些,下面就是实战案例,一起来看一下。 angualrJs清除定时器爬坑之路: 今天发现一个奇怪问题,放在自定义指令里边的定时器竟然在页面跳转之后,在另…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论