JavaScript进阶教程——面向对象、原型对象、this关键字、bind appl call方法

news2024/12/23 9:50:36

文章目录

  • 面向对象
    • ES2015的面向对象语法:
    • ES5的面向对象语法:
  • 原型对象
    • 原型链
    • Object对象的原型
  • this关键字
    • **指向调用方法的对象:**
    • **构造函数:**
    • 触发事件
    • 指向全局对象:
    • 箭头函数
    • 总结
  • bind appl call方法
    • call的用法
      • 参数
    • apply
    • bind
    • 总结

面向对象

ES2015的面向对象语法:

(js可以不适用面向对象的方式开发)

  1. 对象实例化
  2. 构造函数
  3. 方法
  4. 继承
class User {
  constructor(username, password) {
    this.username = username;
    this.password = password
  }
  
  login() {
    if(this.username === "xiaoming" && this.password === "123456") {
      console.log("登录成功")
    }else {
      console.log("登录失败")
    }
  }
}

let user = new User("xiaoming", "123456")
user.login()

class Admin extends User {
  constructor(username, password, id) {
    super(username, password)
    this.id = id
  }
  
  crudUser() {
    console.log("对用户进行操作")
  }
}

let admin = new Admin("xiaoming", "123456", 66)
admin.login()
admin.crudUser()
console.log(admin.id)

总结:

  1. 大部分前端工程师,在工作的过程中,都是用面向过程的方式去解决问题的。因为面向过程代码更简洁,解决问题的方式更直接。
  2. 面向对象的程序设计会大幅度提升代码量,但是如果我们开发的系统,经常会需求变更,功能扩展,或是修复BUG,那么面向对象的程序会有很大的优势。

也就是说,如果问题规模上升,面向对象对于系统的可扩展和可维护性优势是非常突出的。

ES5的面向对象语法:

  1. 构造函数来模拟一个类
  2. 对象实例化: new + 构造函数
  3. 继承: prototype
function User(username, password) {
  this.username = username
  this.password = password
  this.login = function() {
    if(this.username === "xiaoming" && this.password === "123456") {
      console.log("登录成功")
    }else {
      console.log("登录失败")
    }
  }
}

var user = new User("xiaoming", "123456")
user.login()

function Admin() {
  
}

// prototype

原型对象

  1. 原型对象是一个对象,所有的对象都会从原型对象上继承属性和方法
  2. 我们可以使用构造函数(类)的prototyp属性,或者对象的__proto__属性获取到它
function User() {}
// 使用构造函数的prototype属性获取原型对象
// User.prototype = {name: "xiaoming"}
var user = new User()
// 通过user的__proto__属性来获取原型对象
user.__proto__ = {name: "zhangsan"}
console.log(user.name); // zhangsan


// es 2015
class Test{}
Test.prototype.name = "lisi"
let test = new Test()
console.log(test.name); //lisi

prototype用来扩展内置对象的功能

// 原型的方式实现对象的继承
function User(){
  this.login = function() {
    console.log("登录成功")
  }
}

function Admin() {
  
}

Admin.prototype = new User()
var admin = new Admin()
admin.login()

原型链

每个对象都可以有一个原型,这个原型还可以有它自己的原型,以此类推,形成一个原型链。查找特定属性的时候,我们先去这个对象里去找,如果没有的话就去它的原型对象里面去找,如果还是没有的话再去向原型对象的原型对象里去寻找。

function Person() {
  this.id = "007"
}

function User(){
  this.login = function() {
    console.log("登录成功")
  }
}
User.prototype = new Person()
function Admin() {
  
}

Admin.prototype = new User()
var admin = new Admin()
console.log(admin.id)

Object对象的原型

  1. 所有原型链的终点都是Object.prototype
  2. 只要在Object对象的原型上添加属性或方法,所有对象都可以使用。

内置对象的方法是通过原型对象定义的:

  1. Array: push join
  2. Date: getMinutes, getHours
  3. Function: call apply bind
  4. Object : toString

尝试:重写Array的push方法,输出“hello world”
重写function的toString方法

在这里插入图片描述

通过prototype扩展内置对象:
为Date对象添加一个dateFormate方法,使其输入xxx年xx月xx日

在这里插入图片描述

this关键字

this关键字是一个引用,它指向内存中的一个对象。

指向调用方法的对象:

最常用的一种情况,一个对象调用了一个方法,那么方法中的this,指向这个对象。

let cat = {
  name:"zhangsan",
  sayName() {
    console.log(this)
  }
}

cat.sayName()

构造函数:

构造函数中的this,指向new创建出来的对象

function Cat (name) {
  this.name = name
}

var cat = new Cat('lisi')
console.log(cat.name)

触发事件

DOM事件被触发时,事件监听函数中的this指向触发事件的DOM对象。

指向全局对象:

  1. 在全局环境,this指向全局对象window
  2. 在函数中,this同样指向window对象,因为没有从属于某一个对象的函数,是window的方法
    setTimeout中的this也是指向window (除非里面的function使用箭头函数)

箭头函数

  1. 箭头函数中的this,指向函数定义时的上下文
  2. 通常会在内部函数中使用,异步数据交互时会频繁使用(ajax,或计时器)

总结

this关键字的指向问题:

  1. 全局环境下指向全局对象
  2. 全局环境中的this,指向全局对象
  3. 内部函数中的this,指向全局对象
  4. 方法中的this,指向调用方法的对象
  5. 事件中的this,指向触发事件的DOM对象
  6. 构造函数中的this,指向new创建对象
  7. 箭头函数中的this,指向定义函数上下文的this

bind appl call方法

call、apply、bind都是函数的方法,改变函数内部this的指向:

call的用法

call是函数(方法)的方法,通过call,可以改变this的指向,让this指向call的第一个参数

  1. 全局函数调用call
  2. 对象的方法调用call
function fun () {
   console.log(this); // window
}
let cat = {
  name: 'miao'
}
fun.call(cat); // call的第一个参数是对象

-----

let cat = {
  name: 'miao'
}

let dog = {
  name:'wang',
  sayName() {
    console.log("我是" + this.name)
  }
  
}

dog.sayName.call(cat)

实际开发中call如何使用?

利用call来实现继承

// es2015 extends

// es5 原型链

// call 继承 多重继承

function User() {
  this.crudContent = function(){
    console.log("增删改查")
  }
}

function Person() {
  this.login = function() {
    console.log("登录成功")
  }
}

function Admin() {
  User.call(this)
  Person.call(this)
}

var admin = new Admin()

admin.crudContent()
admin.login()

参数

let cat = {
    name: 'miao'
}

let dog = {
    name: 'wang',
    sayName(food1, food2) {
        console.log(`我是${this.name}, 我喜欢吃${food1}${food2}`)
    }
}

dog.sayName('骨头', '肉')
dog.sayName.call(cat, '鱼', '冻干')

apply

跟call一样 除了传参数不一样

let cat = {
    name: 'miao'
}

let dog = {
    name: 'wang',
    sayName(food1, food2) {
        console.log(`我是${this.name}, 我喜欢吃${food1}${food2}`)
    }
}

dog.sayName('骨头', '肉')
dog.sayName.apply(cat, ['鱼', '冻干'])

bind

bind传参跟call一样
但是不会直接运行函数,而是把函数运行结果作为返回值返回。

let cat = {
    name: 'miao'
}

let dog = {
    name: 'wang',
    sayName(food1, food2) {
        console.log(`我是${this.name}, 我喜欢吃${food1}${food2}`)
    }
}

dog.sayName('骨头', '肉')
let newFun = dog.sayName.bind(cat, '鱼', '冻干')
newFun()

总结

  1. call 会调用函数,通过参数列表依次传参
  2. apply 会调用函数,是通过数组来传递参数
  3. bind, 不会调用函数,将新的重新绑定this的函数作为返回值,通过参数列表依次传参

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机图形学入门】笔记4:变换(模型、视图、投影)

目录04变换(模型、视图、投影)1.使用齐次坐标表示的三维变换2.view/Camera 视图变换3.Projection 投影变换1.Orthographic projection 正交投影2.Perspective projection 透视投影 ——更适合人眼成像(近大远小,鸽子为什么这么大&…

AlphaControls 读取存贮数据VCL OnChange事件的处理

AlphaControls 读取存贮数据VCL OnChange事件的处理 AlphaControls控件,窗口时显示,对于VCL控件的处理,需要通过调用皮肤模板重新画出来。因此,在窗口的显示过程中,对VCL控件的数据装载(变更&#x…

从获评毕马威中国领先地产科技50强 看贝壳的长期主义

11月9日,在上海进博会现场,毕马威发布了2022年度(第二届)“毕马威中国领先地产科技企业50”报告,并正式发布了年度毕马威中国领先地产科技企业50榜及地产科技新锐企业榜。作为国内居住产业数字服务平台的贝壳上榜。 众…

前辈给的 Spring Cloud 与 Docker 微服务实战,挽救了要被辞退的我

前言 还记得那天天气阴冷,整个人心都是拔凉拔凉的;原因是因为领导找我聊了一下,委婉地说觉得我的技术不太行,能力不突出;要么自己做出改变,要么选择离开。 说实话,我是有点难过的,…

Lambda完整学习指南

什么是Lambda表达式 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。 Java La…

大学生HTML作业篮球网页 HTML作业篮球网页期末作业 HTML+CSS篮球网页 HTML学生作业体育篮球网页

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

ARS系列毫米波雷达技术一览

近年来,自动驾驶成为了当下最热门的话题。随着自动驾驶技术的发展,作为其关键传感器之一的毫米波雷达,也得到了广泛关注。但就目前来看,海外巨头公司主导着全球毫米波雷达产业的发展,其中,大陆ARS540更以九…

吊打面试官,聊聊:Java中String对象的大小?(史上最全)

下面是一个常见的Java 面试题: 聊聊:Java中String对象的大小? 首先,看看空String占用的空间 当前内存大小是在默认开启压缩指针的条件下 对象头 12char[]数组引用 4int 类型 hash数据大小 4loss due to the next object alignm…

MacOS好用的系统清理工具CleanMyMac有哪些特点功能?

怎么样为Mac选择一款专业靠谱的清理工具?需要满足那些功能呢?对于大多数的新手用户可能并不知道如何来清理Mac系统,当然也不知道在众多清理工具中如何选择。选择一款清理工具最重要的是它的性能如何,能不能有效的帮助用户清理系统…

[附源码]JAVA毕业设计小说阅读网站(系统+LW)

[附源码]JAVA毕业设计小说阅读网站(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

听说你还不了解二叉树?赶紧进来轻松解决

✨个人主页: Yohifo 🎉所属专栏: 数据结构 | C语言 🎊每篇一句: 图片来源 Only by self-respect will you compel others to respect you. 只有自尊才能迫使他人尊敬你。 文章目录📘前言📘正文…

java的vo实体类字段和返回前端接收的字段大小写不一致

java的vo实体类字段和返回前端接收的字段不一致 后台的vo字段和前端接收到的出现大小写一直的情况 例如: 后台字段 /** a_lwa */private String aLwa;前端实际接收到的 这是由于使用lombok插件导致的 解决办法 实体类添加注解强制绑定 /** a_lwa */JsonProperty("aLwa&…

【JavaWeb开发-Servlet】day07-学生成绩管理系统-实现登录注册功能

目录 一、登录功能 1、实现登录页面 ①新建一张登录表:login ②插入一条测试数据 ③新建一个login.jsp登录界面 ④此表的实体Teacher类: ⑤ 然后在写一个dao方法,需要根据用户名查询登录表中的用户信息 ⑥业务层中我们直接调用dao层方法 ⑦在…

【负荷预测】基于灰色理论负荷预测的应用研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

南京邮电大学编译原理实验一(词法分析器的构造)

文章目录一、 实验目的和要求二、实验环境(实验设备)三、实验原理及内容(一)设计概要1、C语言子集2、单词及编码3、状态转换图(二)实现分析(三)结果分析四、实验小结(包括问题和解决方法、心得体…

文本纠错--N-gram--Macbert模型的调用以及对返回结果的处理

文本根据词典进行纠错 输入一段可能带有错误信息的文字, 通过词典来检测其中可能错误的词。 例如:有句子如下:中央人民政府驻澳门特别行政区联络办公室1日在机关大楼设灵堂    有词典如下:中国人民,中央人民&#x…

红帽曹衡康:开源是企业数字化转型的机遇

在数据成为企业核心资产的今天,为了更好地降本增效,实现业务创新和增长,越来越多的企业都开启了数字化转型之路。然而对于绝大多数企业来说,这条转型之路都并非一帆风顺。事实上,数字化转型在为企业开启更多机遇的同时…

爆火Chatgpt注册 chatgpt使用 完全指南

1 chatgpt 简介 ChatGPT是一种语言模型,它被训练来对对话进行建模。它能够通过学习和理解人类语言来进行对话,并能够生成适当的响应。ChatGPT使用了一种叫做Transformer的神经网络架构,这是一种用于处理序列数据的模型,能够在输入…

Java System类

JavaSystem类\huge{Java \space System类}Java System类 System类概述 简而言之:SystemSystemSystem类就是一个工具类,直接调用对应的方法来使用即可,不需要也不能被实例化。 常用方法 ①. exit() 退出Java虚拟机 //执行这个exit(0)代码之…

[附源码]计算机毕业设计的花店售卖系统的设计与实现Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…