曾经有人说 JS 语言中万物皆对象,虽然这种说法不一定完全准确,但也有一定的道理。原因是 JS 的语法看起来所有的数据类型都像是一个对象,包括原始类型。

const a = 1.234;
console.log(a.toString());
console.log(a.valueOf());
console.log(a.toFixed(2));
console.log(Number.prototype); // 查看所有 Number 类型的原型链方法属性 const b = '前端路引';
console.log(b.length);
console.log(b.substring(2));
console.log(b.padEnd(10, '*')); // 后填充 * 字符
console.log(String.prototype); // 查看所有 String 类型的原型链方法属性 const c = true;
console.log(c.toString());
console.log(Boolean.prototype); // 查看所有 Boolean 类型的原型链方法属性

以上展示了 Number、String、Boolean 三种原始类型的方法。a.xxx() 这种写法就表示 xxx 是 a 的方法。

一般定义在对象上的 函数 都称之为 对象方法,使用语法: xxx.yyy()。对象除了方法还有 对象属性,使用语法: xxx.yyy

方法和属性的区别是:方法是函数,属性是值。

举个例子:

const obj = {
name: '前端路引', // 对象属性
age: 1, // 对象属性
sayHi() { // 对象方法
console.log(`我是${this.name},我今年${this.age}岁`);
}
}

以上是一个 JS 的对象字面量定义方式,除了最常用的对象字面量,还可以像 Array 一样,使用构造函数来定义对象,也可以使用 Class 自定义对象。

对象定义

JS 的对象定义可比 数组 的花样多多了,下面来一一展示。

对象字面量

JS 的对象值与数组一样,无任何限制,可以是任意值,包括函数、数组、对象、undefined、null、NaN 等。

const dynamicKey = 'dynamicKey';
const fnKey = () => {}; const obj1 = {
name: '前端路引',
age: 1,
'favorite-color': 'blue', // 含特殊字符的键需用引号包裹
[Symbol('id')]: 123, // Symbol 作为键
[dynamicKey]: 'value', // 使用动态变量作为属性名
[fnKey]: '使用函数作为键名称',
greet() { // 方法简写(ES6+)
console.log('Hello!');
},
say: function () { // 函数
console.log('Hi!');
}
};

构造函数

虽然此方法使用较少,但这种方式也可以用来定义一个对象。以下代码与上面的对象字面量定义的对象一样:

const dynamicKey = 'dynamicKey';
const fnKey = () => {}; const obj2 = new Object();
obj2.name = '前端路引';
obj2.age = 1;
obj2['favorite-color'] = 'blue';
obj2[Symbol('id')] = 123;
obj2[dynamicKey] = 'value';
obj2[fnKey] = '使用函数作为键名称';
obj2.greet = function () {
console.log('Hello!');
}
obj2.say = function () {
console.log('Hi!');
}

Object.create()

使用对象的静态方法 Object.create() 来创建对象。

静态方法和对象原型链方法的区别是:静态方法属于对象本身,对象原型链上的方法属于对象实例。

看例子:

const obj3 = Object.create({ // 使用静态方法创建对象
name: '前端路引',
})
obj3.toString() // 调用原型链方法,也称为实例方法

Object.create 多用于继承一个对象,扩展原有对象的功能:

const obj4 = {
name: '前端路引',
}
const obj5 = Object.create(obj4);
obj5.age = 1;
obj5['favorite-color'] = 'blue';

自定义构造函数

除了使用 JS 提供的内置构造函数,还可以自定义构造函数来创建一个对象。比如:

function WeChat () {
this.name = '前端路引';
this.age = 1;
this['favorite-color'] = 'blue';
}
const obj6 = new WeChat();

function 关键字可不止用于函数定义,还能用来自定义构造函数,这是在 ES6 出现之前自定义类最常用的方式。

Class

为了消除语法歧义,ES6 引入了 Class 定义类,再通过 new 关键字创建实例对象,这种方式完全像是 function 的语法糖。

class WeChat {
constructor() {
this.name = '前端路引';
this.age = 1;
this['favorite-color'] = 'blue';
}
say() {
console.log('Hi!');
}
}
const obj7 = new WeChat();

对象取值

对象的取值方法也多得眼花缭乱,下面一一展示。

点语法

常规属性可以使用 . 取值,比如:

const obj1 = {
name: '前端路引',
age: 1,
'favorite-color': 'blue',
say() {
console.log('Hi!');
}
}
console.log(obj1.name); // 获取属性值
console.log(obj1.say()); // 调用方法

方括号取值

. 语法有个问题,比如上面对象中 favorite-color 属性,如果直接使用 obj1.favorite-color,会报错,因为 - 会被当做减号处理,导致报错 ReferenceError: color is not defined

这时候可以把对象当做数组来处理,使用方括号 [] 取值,比如:

const obj1 = {
name: '前端路引',
age: 1,
'favorite-color': 'blue',
say() {
console.log('Hi!');
}
}
console.log(obj1['favorite-color']); // 获取属性值
console.log(obj1['say']()); // 调用方法

使用方括号取值时,如果属性名是动态的,可以使用变量来取值,比如:

const dynamicKey = 'dynamicKey';

const obj1 = {
[dynamicKey]: '前端路引',
}
console.log(obj1[dynamicKey]);

解构赋值

作为 ES6 引入的新特性,此写法如果不了解,那么代码可能都看不懂。

const obj1 = {
name: '前端路引',
age: 1,
} const { name, age, up = '微信公众号' } = obj1;
console.log(name, age);
// 解构赋值,可以添加默认值,如果找不到属性,则使用默认值
console.log(up);

Object 静态方法

Object 自身还提供了一些静态方法,用于获取数组的键值。

const obj1 = {
name: '前端路引',
age: 1,
}
const keys = Object.keys(obj1); // 返回所有可枚举属性名数组
const values = Object.values(obj1);// 返回所有值数组
const entries = Object.entries(obj1); // 返回键值对数组
console.log(keys); // ['name', 'age']
console.log(values); // ['前端路引', 1]
console.log(entries); // 二维数组 [['name', '前端路引'], ['age', 1]]

Getter / Setter 方法

使用 get 方法,可以设置对象的计算属性,用于拦截对象的取值,比如:

const obj1 = {
firstName: '微信公众号:',
lastName: '前端路引',
get name() {
return `${this.firstName}:${this.lastName}`; // 微信公众号::前端路引
},
set name(value) {
[this.firstName, this.lastName] = value.split(':');
}
}
console.log(obj1.name); // 微信公众号:前端路引
obj1.name = '前端路引:微信公众号';
console.log(obj1.name); // 前端路引:微信公众号

原型链访问

如果取的属性对象本身不存在,则会顺着原型链查找,直到找到为止,比如:

const obj1 = {
name: '前端路引',
age: 1,
}
console.log(obj1.toString()); // toString 方法不在对象本身,是 Object 原型链上的方法,也可以使用取值语法访问

可选链

ES2020 引入了可选链,用于解决对象取值时,如果属性不存在,会报错的问题,比如:

const obj1 = {
name: '前端路引',
age: 1,
}
// 如果直接取值,将会报错 TypeError: Cannot read properties of undefined (reading 'city')
console.log(obj1.address.city);
// 使用可选链,如果属性不存在,则返回 undefined,不会报错
console.log(obj1?.address?.city);

写在最后

以上已包含绝大多数应用场景,但是也会有一些不太常用的写法未包含,比如 Reflect.get(obj, 'a')。作为入门条件,掌握以上内容已经完全够用。

Web前端入门第 61 问:JavaScript 各种对象定义与对象取值方法的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. Android零基础入门第61节:滚动视图ScrollView

    原文:Android零基础入门第61节:滚动视图ScrollView 前面几期学习了ProgressBar系列组件.ViewAnimator系列组件.Picker系列组件和时间日期系列组件,接下来几期 ...

  3. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  4. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  5. WEB前端工程师整理的原生JavaScript经典百例

    一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...

  6. Web前端基础怎么学? JavaScript、html、css知识架构图

    以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...

  7. web前端学习之HTML CSS/javascript之一

    前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...

  8. web前端学习(四)JavaScript学习笔记部分(6)-- js内置对象

    1.JS内置对象-什么是对象 1.1.什么是对象: JavaScript中的所有事物都是对象:字符串.数值.数组.函数 每个对象带有属性和方法 JavaScript允许自定义对象 1.2.自定义对象: ...

  9. javascript对象转换,动态属性取值

    $(document).ready(function(){ var exceptionMsg = '${exception.message }'; var exceptionstr = ''; //j ...

  10. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

随机推荐

  1. 【Abaqus热分析】热膨胀系数设置

    来源:帮助文档

  2. MAMP PRO教程

    简单使用 第一步 创建新主机,按主机表左下角的"+"按钮. 第二步 配置域名和项目地址 第三步 选择你要使用的web服务器 第四步 配置URL重写规则 第五步 检查端口号 第六步 ...

  3. webpack3使用additionalData和prependData都不管用

    10.css相关配置 utils.js sass: generateLoaders('sass', { indentedSyntax: true, implementation: require('n ...

  4. 【Pandas】concat方法使用注意点

    使用pandas库的concat做数据拼接需要注意,应该先对原始数据设置列名,如果没有设置列名,在拼接时只会保留第一个文件的第一行(以列名形式),由于剩下的文件在读取时会自动将第一行作为列名,这样就会 ...

  5. git 取消 git add 操作

    ... 按照套路我们在对项目做了一些新增或修改操作后,会很自然的执行 git add 操作, 但是马上又发现好像添加的内容有点不对: 文件名错了 多了个符号 少了点什么 马上发现bug 等等... 总 ...

  6. ASP.NET Session 清除

    // 值为 null,这样对应的 Session 会继续存在,但值为 null Session["UserId"] = null; // 移除指定 Session Session. ...

  7. CLI命令行应用

    前言 针对golang这门高级语言,主要想了解它的语言特性还有服务器建站还有微服务搭建方面的用途,以下都可以算是使用记录. 一.命令行应用的标准库实现 很多语言都有针对命令行参数的功能包,比如pyth ...

  8. idea插件开发踩坑记录

    问题 build.gradles.kts配置文件中全部爆红,提示Cannot access script base class 'org.gradle.kotlin.dsl.KotlinBuildSc ...

  9. 附043.KubeEdge边缘云部署实施方案

    目录 KubeEdge介绍 KubeEdge概述 KubeEdge优势 KubeEdge架构 KubeEdge部署 部署依赖 部署规划 主机名配置 变量准备 互信配置 环境预配置 安装keadm 设置 ...

  10. 一款 .NET 开源、免费、轻量级且非侵入性的防火墙软件

    前言 在当今数字化时代,系统服务器网络安全已成为我们日常生活和工作中不可忽视的重要议题.随着网络威胁的日益复杂和多样化,选择一款高效.可靠且易于使用的防火墙软件显得尤为重要.今天大姚给大家分享一款 . ...