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日

相关文章

  • 实用的JS表单验证提示效果

    要实现“实用的JS表单验证提示效果”,我们需要以下步骤: 1. 编写HTML代码 我们需要为表单元素添加id或class属性,以便我们可以使用JavaScript代码对其进行操作。 <form id="myForm"> <label for="username">用户名:</label&g…

    JavaScript 2023年6月10日
    00
  • php实现数组中索引关联数据转换成json对象的方法

    当我们需要将 PHP 中的索引关联数组转换为 JSON 对象时,可以使用 json_encode() 函数完成这个任务。 下面是一个将 PHP 关联数组转换为 JSON 对象的示例代码: <?php $data = array( ‘name’ => ‘John’, ‘age’ => 30, ’email’ => ‘john@examp…

    JavaScript 2023年6月11日
    00
  • 一个简单的网站访问JS计数器 刷新1次加1次访问

    实现一个简单的网站访问计数器可以通过 JavaScript 来完成。我们需要在网站的页面中添加一个计数器的容器,然后通过 JavaScript 代码来动态修改这个容器中的数值即可。 以下是实现这个计数器的一些步骤: 1. 建立计数器的容器 我们需要创建一个 HTML 元素来表示这个计数器的容器,并且给它一个初始值。例如,在一个网站主页中,我们可以添加一个 &…

    JavaScript 2023年6月11日
    00
  • 基于JavaScript介绍性能爆表的SolidJS

    会的。 SolidJS是一个构建Web应用程序的JavaScript库,它基于React的概念,但它更加轻量级且性能更加优越。下面我会详细介绍如何使用SolidJS来构建高性能的Web应用程序。 安装SolidJS 首先,需要安装SolidJS和一些相关的依赖库。可以使用npm进行安装: npm install solid-js solid-js/web n…

    JavaScript 2023年6月10日
    00
  • JavaScript 原型继承

    JavaScript 原型继承 JavaScript 原型继承是一种非常重要的概念,相较于传统的面向对象语言中的继承,JavaScript 通过原型继承来实现对象之间的属性和方法的共享,它是 JavaScript 中最为灵活的一种继承方式。 定义 JavaScript 中的每个对象(除了 null)都有一个原型对象,原型对象可以通过 Object.getPr…

    JavaScript 2023年6月10日
    00
  • JS实现五星好评效果

    实现五星好评效果主要分两个步骤,分别是HTML结构布局和JavaScript脚本编写。 HTML结构布局 首先,需要在页面中创建五个星星图标,可以使用<i>标签,设置样式为fa fa-star,并将五个星星元素放置在指定的容器内,如下所示: <div class="star-rating"> <i id=&q…

    JavaScript 2023年6月11日
    00
  • Vue中nprogress页面加载进度条的方法实现

    下面详细讲解在 Vue 中实现 NProgress 页面加载进度条的方法。 什么是 NProgress? NProgress 是一个轻量级的页面加载进度条库,通常用于在页面加载的过程中展示加载的进度。 安装 NProgress 我们可以使用 npm/yarn 安装 NProgress。 npm install nprogress # 或 yarn add n…

    JavaScript 2023年6月11日
    00
  • Vue Router深扒实现原理

    Vue Router深扒实现原理 Vue Router 是 Vue.js 官方的路由管理器插件,是构建 Vue.js 单页应用程序必不可少的工具之一。Vue Router 提供了诸如路由参数、路由匹配、嵌套路由等功能,可以帮助我们快速构建复杂的应用程序。本文将深入剖析 Vue Router 的实现原理,包括路由映射、导航守卫、懒加载等方面。 路由映射 在 V…

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