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

yizhihongxing

当我们使用 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转换二进制编码为ASCII码的方法

    要将JavaScript中的二进制编码转换成ASCII码,可以使用String.fromCharCode()方法和String.charCodeAt()方法中的其中一个。 使用String.fromCharCode()方法 String.fromCharCode()方法可以将unicode值转化成ASCII码。 下面是一个简单的示例,将二进制编码“01000…

    JavaScript 2023年5月20日
    00
  • jsPDF导出pdf示例

    以下是关于如何使用jsPDF导出pdf的详细攻略,包含两个示例。 什么是jsPDF jspdf是一个用于生成PDF文件的JavaScript库。它可以在浏览器端和Node.js环境中使用。它可以轻松地将HTML内容转换为PDF文件,例如HTML文本,SVG图像等。 安装jsPDF 你可以通过npm安装jsPDF: npm install jspdf –sa…

    JavaScript 2023年5月27日
    00
  • JS判断字符串变量是否含有某个字串的实现方法

    JS判断字符串变量是否含有某个字串的实现方法可以使用JS字符串对象提供的indexOf()方法。 indexOf()方法返回被查找字符串的起始位置,如果没有找到则返回-1。通过这个方法,可以判断某个字符串是否在原字符串中存在,从而实现判断字符串变量是否含有某个字串。 以下是具体的实现方法: 方法一:使用indexOf()方法 语法格式: string.ind…

    JavaScript 2023年5月28日
    00
  • js String对象中常用方法小结(字符串操作)

    下面我来详细讲解一下“js String对象中常用方法小结(字符串操作)”的完整攻略。 1. String对象 在JavaScript中,字符串属于基本类型,但对于字符串的操作,可以使用JavaScript内置的String对象提供的方法。 2. 常用方法小结 2.1 字符串连接 字符串连接是指将两个或多个字符串合并成一个字符串,String对象提供的连接方…

    JavaScript 2023年5月20日
    00
  • js屏蔽F12审查元素,禁止修改页面代码等实现代码

    实现屏蔽F12审查元素和禁止修改页面代码需要结合JavaScript和HTML的相关特性。以下是一个完整的攻略: 1. 使用JavaScript禁止页面右键功能 在页面中加入以下JavaScript代码,可以禁止页面的右键功能: document.oncontextmenu = function () { return false; } 以上代码中,docu…

    JavaScript 2023年6月10日
    00
  • JavaScript中文件上传API详解

    JavaScript中文件上传API详解 文件上传是网站开发中经常需要实现的功能之一,而JavaScript作为前端语言也提供了一些API来帮助我们实现文件上传的功能。 input标签的type属性为file的使用 最常见的文件上传方式就是使用表单中的input标签,将type属性值设为file。用户在选择了文件后,会将文件的信息保存在该标签的value属性…

    JavaScript 2023年5月27日
    00
  • document.execCommand()的用法小结

    标题:document.execCommand()的用法小结 简介 document.execCommand() 是一个可以对富文本编辑器进行操作的 JavaScript API。它可用于设置文本样式、格式化或插入内容等操作。它最初在 Internet Explorer 5.5 中引入,但现在大多数主流浏览器都支持这个 API 了。 语法 document.…

    JavaScript 2023年6月11日
    00
  • 千万不要错过的JavaScript高效对比数组差异方法

    千万不要错过的JavaScript高效对比数组差异方法 在JavaScript编程中,我们常常需要对比两个数组之间的差异,找出其中共有和不同的部分。本文介绍了JavaScript中三种高效对比数组差异的方法,分别是使用ES5中Array的filter、ES6中的Set,以及lodash库中的difference方法。 1. 使用Array的filter方法 …

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