JavaScript创建对象的几种方式及关于this指向问题

当我们使用 JavaScript 开发应用时, 经常要通过创建对象来实现某些功能。JavaScript 中有多种方式可以创建对象,下面是几种常见的方法。

1. 字面量方式

最常见的创建对象的方式就是使用字面量方式,我们使用对象字面量来创建一个对象,并将其赋值给一个变量或常量。

const obj = {
    name: 'Tom',
    age: 20
}

对象字面量语法非常简单,它遵循一对大括号“{}”来定义,对象中的属性用“键名:属性值”的形式来定义。上述代码创建了一个对象 obj,包含两个属性 nameage

2. 构造函数方式

除了字面量方式,我们还可以使用构造函数来创建对象。构造函数可以理解为一个模板,用于创建多个相似对象。在构造函数内部,通过 this 关键字添加属性和方法,这些属性和方法会作为实例的属性和方法。

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.sayHi = function () {
        console.log(`Hi, I'm ${this.name}.`);
    }
}

const person1 = new Person('Tom', 20);
person1.sayHi(); // Hi, I'm Tom.

上述代码中,我们创建了一个名为 Person 的构造函数,通过 this 关键字给该函数添加了 nameage 属性,以及 sayHi 方法。之后又使用 new 关键字创建了一个 person1 实例,该实例包含了之前添加的属性和方法,最后调用了 sayHi 方法输出了 Hi, I'm Tom.

3. 工厂函数方式

与构造函数方式类似,我们还可以使用工厂函数来创建对象。工厂函数其实就是一个返回对象的函数,工厂函数可以接收参数,根据参数的不同返回不同的对象。

function createPerson(name, age) {
    return {
        name,
        age,
        sayHi() {
            console.log(`Hi, I'm ${this.name}.`);
        }
    };
}

const person2 = createPerson('Jerry', 22);
person2.sayHi(); // Hi, I'm Jerry.

上述代码中,我们创建了一个名为 createPerson 的工厂函数,该函数接收参数 nameage,并返回一个包含 nameage 属性以及 sayHi 方法的对象。我们使用该工厂函数创建了实例 person2,并调用了 sayHi 方法,输出了 Hi, I'm Jerry.

this指向问题

在 JavaScript 中,this 关键字通常指向当前函数执行时所在的对象。但是有许多情况下,this 指向的对象并不是我们期望的对象。可能是因为我们忽略了 JavaScript 中 this 的特殊性,或者没有使用正确的 this 绑定方法,导致了 this 的指向出现问题。涉及到 this 指向问题的场景,常见的有以下几种。

this 指向全局对象

当在函数中使用 this 时,如果当前函数没有明确指定 this 指向哪个对象,那么 this 就会指向全局对象,也就是 window

function showName() {
    console.log(this.name);
}

const obj = {
    name: 'Tom',
    showName: showName
}

showName(); // undefined

obj.showName(); // Tom

上述代码中,showName() 函数中没有明确指定 this 指向哪个对象,而直接调用函数时,this 指向 window,因此输出 undefined。而在 obj.showName() 中,this 指向调用该方法的对象 obj,因此输出 Tom

箭头函数中的this

与其他函数不同,箭头函数中的 this 关键字指向函数定义时所处的作用域,而非函数执行时所在的作用域。因此,当我们在箭头函数中使用 this 时,它不会被绑定到函数调用的对象上,而会被绑定到当前代码执行上下文的作用域链中。

const obj = {
    name: 'Tom',
    greet() {
        const morning = () => {
            console.log(`Good morning, ${this.name}.`);
        };
        morning();
    }
};

obj.greet(); // Good morning, Tom.

上述代码中,我们使用箭头函数 morning 来输出对 obj 中属性 name 的引用。由于箭头函数中的 this 关键字指向函数定义时所处的作用域,所以它能访问 greet 方法中的 this 对象,从而输出了 Good morning, Tom.

通过以上的讲解,我们对于 javascript 中常用的对象创建方式及 this 指向的问题有了进一步的了解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript创建对象的几种方式及关于this指向问题 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 浅谈JavaScript中的字符编码转换问题

    浅谈JavaScript中的字符编码转换问题 什么是字符编码? 在计算机中,字符的内部表示是使用数字来表示的。我们所看到的文字、符号等内容在计算机中都需要通过数字编码来表达。因此,字符编码就是一种将字符映射为数字的方式。 常用的字符编码有ASCII、Unicode、UTF-8等。 JavaScript中的字符编码 在JavaScript中处理字符编码主要涉及…

    JavaScript 2023年5月20日
    00
  • 你真的了解BOM中的history对象吗

    当涉及到浏览器对象模型(BOM)时,常用的对象之一就是history对象。 这个对象允许我们访问正在打开并已经关闭的浏览器窗口的历史记录。 1. history对象简介 history对象是浏览器的窗口历史记录, 它是Window对象中的一个属性,可以使用window.history属性来访问它。history对象包含用户在浏览器中访问的所有页面的历史记录,…

    JavaScript 2023年6月11日
    00
  • async/await实现Promise.all()的方式

    使用async/await实现Promise.all()的方式,需要结合async函数和await关键字来实现,具体步骤如下: 定义一个异步函数asyncPromiseAll,接收一个Promise数组作为参数,并在该函数内部使用await关键字等待所有Promises的执行结果。 通过使用try-catch代码块,捕获异常并将其抛出以确保异步函数能够正常执…

    JavaScript 2023年5月27日
    00
  • 在JavaScript中处理字符串之fontcolor()方法的使用

    在JavaScript中处理字符串之fontcolor()方法的使用 简介 JavaScript 提供了一些内置方法,用来处理字符串,其中之一就是 fontcolor() 。 fontcolor() 方法用于创建带有指定颜色的 HTML <font> 标签,用于改变文本颜色。 该方法接受一个参数 color,该参数是一个字符串,值为想要应用的颜色…

    JavaScript 2023年5月28日
    00
  • TypeScript 学习总结

    TS:是JS的超集,即对JS的扩展,主要提供了类型系统和对ES6+的支持,但TS最终会转换为js代码去执行。特点:1. 始于JavaScript, 归于JavaScript2. 强大的类型系统3. 先进的JavaScript TypeScript JavaScript 语言 面向对象编程语言 面向脚本编程 是否支持可选参数 支持 不支持 是否支持静态类型 支…

    JavaScript 2023年4月18日
    00
  • JavaScript高级程序设计(第3版)学习笔记12 js正则表达式

    下面是详细的攻略: JavaScript高级程序设计(第3版)学习笔记12 js正则表达式 简介 本篇学习笔记介绍JavaScript正则表达式的基础知识,包括正则表达式的定义、创建、元字符、模式修饰符、贪婪与非贪婪匹配、匹配位置等知识点。 正则表达式的定义 正则表达式是一种用来匹配字符串模式的方法,它由一个或多个字符和特殊字符组成,表示一种模式,用于与字符…

    JavaScript 2023年6月10日
    00
  • JavaScript函数之call、apply以及bind方法案例详解

    JavaScript函数之call、apply以及bind方法案例详解 本文将详细介绍JavaScript中的函数三大方法:call、apply、bind。它们用于改变函数内部this指向的对象,并且可以传递一些参数,方便我们灵活地调用函数。在本文中,我们将一步一步的讲解这三个函数的使用方法,并通过多个示例来详细说明其使用场景与细节问题。 call() 方法…

    JavaScript 2023年6月11日
    00
  • Javascript File和Blob详解

    Javascript File和Blob详解 Javascript File和Blob是Web开发中常用的两类数据对象,用于处理二进制数据和文件操作。本文将详细讲解它们的定义、常用方法以及应用场景。 什么是Javascript File? Javascript File是一个具有文件名和文件内容的对象,用于处理文件的读写、上传、下载等操作。它是通过File …

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部