js进阶——this和对象原型

1. this 在 JavaScript 中的应用

在 JavaScript 中,this 的值取决于函数的执行上下文和调用方式。以下是 this 在不同上下文中的行为解释:

A. 全局上下文(非严格模式)

在全局执行上下文中,this 指向全局对象(在浏览器中是 window 对象,在 Node.js 中是 global 对象)。

console.log(this); // 在浏览器中,this 指向 window 对象
B. 函数上下文

函数内部的 this 取决于函数的调用方式:

  1. 作为对象的方法调用
    当函数作为对象的方法被调用时,this 指向调用该方法的对象。

    const obj = {name: 'Alice',greet() {console.log(this.name);}
    };
    obj.greet(); // 输出 'Alice', 因为 this 指向 obj
    
  2. 作为普通函数调用
    在非严格模式下,普通函数调用中的 this 指向全局对象(浏览器中为 window),而在严格模式下,thisundefined

    function showName() {console.log(this.name);
    }// 非严格模式下
    showName(); // this 指向 window,可能会输出 undefined// 严格模式下
    'use strict';
    showName(); // this 是 undefined,调用会抛出错误
    
  3. 构造函数调用
    当使用 new 关键字调用构造函数时,this 指向新创建的对象。

    function Person(name) {this.name = name;
    }const person = new Person('Bob');
    console.log(person.name); // 输出 'Bob', this 指向新对象 person
    
  4. 箭头函数中的 this
    箭头函数不绑定自己的 this,它会捕获上下文中最近的 this 值。箭头函数常用于避免 this 在不同上下文中变化。

    const obj = {name: 'Carol',greet: function() {const innerFunc = () => {console.log(this.name); // this 来自 obj 上下文};innerFunc();}
    };obj.greet(); // 输出 'Carol'
    
C. callapplybind

这三个方法可以显式地绑定 this,并控制函数中的 this 值。

  1. call
    使用 call 可以显式指定 this,并立即调用函数。

    function greet() {console.log(this.name);
    }const person = { name: 'David' };
    greet.call(person); // 输出 'David'
    
  2. apply
    applycall 类似,但它接受的是数组作为参数。

    function introduce(age, country) {console.log(`${this.name}, ${age}, from ${country}`);
    }const person = { name: 'Eva' };
    introduce.apply(person, [25, 'USA']); // 输出 'Eva, 25, from USA'
    
  3. bind
    bind 会返回一个新函数,this 永远绑定到指定的值。

    const person = { name: 'Frank' };
    const boundFunc = greet.bind(person);
    boundFunc(); // 输出 'Frank'
    

2. 对象原型(Prototype)

JavaScript 中的原型机制是对象之间继承的核心。每个 JavaScript 对象都有一个与之相关联的原型对象(prototype),通过它可以实现属性和方法的继承。

A. 原型链

每个对象都有一个内部属性 [[Prototype]](可以通过 __proto__ 访问)。如果在对象上找不到某个属性,JavaScript 会沿着原型链向上查找,直到找到该属性或到达原型链的顶端(null)。

const animal = {speak() {console.log('Animal sound');}
};const dog = {bark() {console.log('Woof!');}
};// 将 dog 的原型设为 animal
dog.__proto__ = animal;dog.bark(); // 输出 'Woof!'
dog.speak(); // 输出 'Animal sound', 来自 animal 的原型
B. 构造函数与原型

当通过构造函数创建对象时,构造函数的 prototype 属性会成为新对象的原型。

function Person(name) {this.name = name;
}Person.prototype.greet = function() {console.log(`Hello, my name is ${this.name}`);
};const john = new Person('John');
john.greet(); // 输出 'Hello, my name is John'
C. Object.create()

Object.create() 是一个常用方法,可以创建一个新对象,并将其原型设置为指定的对象。

const parent = {speak() {console.log('I am parent');}
};const child = Object.create(parent);
child.speak(); // 输出 'I am parent', child 继承了 parent 的方法
D. 原型链继承的缺陷

由于 JavaScript 中的对象共享同一原型,当修改原型对象的属性时,所有继承该原型的对象都会受到影响。

function Animal() {}Animal.prototype.legs = 4;const dog = new Animal();
const cat = new Animal();dog.legs = 3; // 修改实例属性
console.log(cat.legs); // 输出 4,cat 的 legs 没有受到影响Animal.prototype.legs = 2; // 修改原型属性
console.log(dog.legs); // 输出 3,实例属性优先
console.log(cat.legs); // 输出 2,受原型修改影响

总结

  • this 是 JavaScript 中一个强大但有时难以理解的机制,其值取决于函数调用的方式。
  • 原型机制和原型链是 JavaScript 中对象继承的基础,构成了对象与函数的继承关系。

深入理解 this 和对象原型可以帮助你更好地掌握 JavaScript 的复杂机制,在构建复杂应用程序时写出更清晰、可维护的代码。

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

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

相关文章

华为为什么要做三折叠屏手机?

前些天我做了一条视频,关于讲华W的新的三折叠屏手机。我说我有点失望,结果引起了华W的同事的一些关注。于是,华W几位高管都跑过来,跟我解释为什么会出现这样的一个状态。 我才知道,这款手机他们其实是亏着钱在卖的。因…

C++速通LeetCode中等第1题-字母异位词分组

思路要点&#xff1a;对字符串排序&#xff0c;排序结果存放在map的key中&#xff0c;排序结果相同的字符串存放到map的value中 。 class Solution { public:string keys;vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vecto…

EECS498 Deep Learning for Computer Vision (一)软件使用指南

#最近开始学习深度学习的相关基础知识&#xff0c;记录一下相关笔记及学习成果# learning&#xff1a;building artificial systems that learn from data and experience deep learning(a set of machine learning): hierarchical learning algorithms with many "laye…

海洋大地测量基准与水下导航系列之二国外海底大地测量基准和海底观测网络发展现状(上)

海底大地控制网建设构想最先由美国斯克里普斯海洋研究所(Scripps Institution of Oceanography,SIO)提出&#xff0c;目前仅有少数发达国家具备相应技术条件。美国、日本、俄罗斯和欧盟等发达国家通过布测先进的海底大地控制网&#xff0c;不断完善海洋大地测量基准基础设施&am…

6、等级保护政策内容

数据来源&#xff1a;6.等级保护政策内容_哔哩哔哩_bilibili 信息安全产品管理与响应 等级管理 对信息系统中使用的信息安全产品实行按等级管理&#xff0c;信息安全事件应分等级响应与处置。 预测评服务由测评公司和咨询公司提供预测评服务&#xff0c;根据技术要求和测评要…

c语言中define使用方法

在C语言中&#xff0c;#define指令是预处理指令&#xff0c;用于定义宏。其常用格式是&#xff1a; 定义常量&#xff1a; #define 常量名 常量值 例子&#xff1a; #define PI 3.14159 #define MAX_SIZE 100 这里&#xff0c;PI和MAX_SIZE在代码中会被替换为其对应的值。没有…

深度学习01-概述

深度学习是机器学习的一个子集。机器学习是实现人工智能的一种途径&#xff0c;而深度学习则是通过多层神经网络模拟人类大脑的方式进行学习和知识提取。 深度学习的关键特点&#xff1a; 1. 自动提取特征&#xff1a;与传统的机器学习方法不同&#xff0c;深度学习不需要手动…

利用Downloader下载文件(C#)

参考链接&#xff1a;https://github.com/bezzad/Downloader public static async Task<bool> HttpDownloadFile(string downloadUrl, string localPath, log4net.ILog log) { bool bFlagDownloadFile false; //log.Debug("HttpD…

免费开源微信机器人 教程/文档/开发

API接口的核心 对于小白而言&#xff0c;初看API文档可能是一头雾水的——从哪里看&#xff0c;怎么看&#xff0c;看什么是摆在面前的问题。 删除朋友圈 简要描述&#xff1a; 删除朋友圈 请求URL&#xff1a; http://域名地址/deleteSns 请求方式&#xff1a; POST 请…

前端工程化4:从0到1构建完整的前端监控平台

前言 一套完整的前端监控系统的主要部分&#xff1a; 数据上报方式数据上送时机性能数据采集错误数据采集用户行为采集定制化指标监控sdk 监控的目的&#xff1a; 一、数据上报方式 本文的方案是&#xff0c;优先navigator.sendBeacon&#xff0c;降级使用1x1像素gif图片…

pg入门11-pg中的publications是什么

在 PostgreSQL&#xff08;PG&#xff09;中&#xff0c;Publication&#xff08;发布&#xff09;是逻辑复制机制中的一个概念&#xff0c;用于定义哪些表的数据变更&#xff08;INSERT、UPDATE、DELETE&#xff09;可以发布到订阅者&#xff08;Subscribers&#xff09;。它主…

Python3网络爬虫开发实战(17)爬虫的管理和部署(第一版)

文章目录 一、 Scrapyd 分布式部署1.1 了解 Scrapyd1.2 准备工作1.3 访问 Scrapyd1.4 Scrapyd 的功能1.5 ScrapydAPI 的使用 二、Scrapyd-Client 的使用2.1 准备工作2.2 Scrapyd-Client 的功能2.3 Scrapyd-Client 部署 三、Scrapyd 对接 Docker3.1 准备工作3.2 对接 Docker 四、…

Linux网络工具:用于查询DNS(域名系统)域名解析信息的命令nslookup详解

目录 一、概述 二、基本功能 1、查询域名对应的IP地址 2、查询IP地址对应的主机名 3、查询特定类型的DNS记录 三、用法 1、命令格式 2、常用选项 五、nslookup的安装 1. 打开终端 2. 更新的系统包列表 3. 安装 bind-utils 软件包 &#xff08;1&#xff09;对于Ce…

[JavaEE] 网络编程----UDP / TCP 回显服务器

Author&#xff1a;MTingle major:人工智能 --------------------------------------- Build your hopes like a tower! 文章目录 文章目录 一.客户端VS服务器 二.TCP / UDP 特点 三.UDP 回显服务器 UDP 服务器 UDP 客户端 UDP字典 四.TCP 回显服务器 TCP 服务器 TCP 客…

下载分享抖音视频并转成文本

思路 将分享的链接转义成可以正常链接。通过链接去找到对应的视频链接。在通过返回的html。解析里面视频的资源链接在playAddr字段里面。拿到链接后转义urlPath即可获取到资源信息。下载视频。科大讯飞语音转文本。处理json保存到本地。 部分代码 获取抖音链接&#xff1a; …

Vue点击按钮生成pdf文件/Vue点击按钮生成png图片

本次案例是vue的点击生成pdf文件和png格式的图片 一、生成pdf文件案例 看代码之前&#xff0c;我们肯定得需要看看&#xff0c;效果图是什么的啦&#xff0c;这样子才能先看看自己想要实现的效果是不是这样子的&#xff01;上效果图嘿嘿嘿~ A、实现的效果图 这是页面&#…

java intellij idea开发步骤,使用指南,工程创建与背景色字体配置,快捷键

intellij idea2021 配置背景色&#xff0c;字体大小&#xff0c;主题 快捷键

茴香豆的茴的写法-SpringBoot处理客户端请求的几种方式

方式1&#xff1a;Controller或者RestController /*** 方式1&#xff1a;Controller* */ RestController public class AtController {GetMapping("/at")public String at() {return "Controller";} }方式2&#xff1a;Component Controller接口 /*** 方…

JACM23 - A New Algorithm for Euclidean Shortest Paths in the Plane

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 本文关注的问题为计算几何学中的经典问题&#xff0c;即「在平面上给定一组两两不相交的多边形障碍物&#xff0c;寻找两点…

PyAutoGUI was unable to import pyscreeze.问题

转载&#xff1a; 【问题解决】 PyAutoGUI was unable to import pyscreeze.-CSDN博客 重点&#xff1a; 1.先安装pyscreeze。 2.安装pillow。