Web前端入门第 61 问:JavaScript 各种对象定义与对象取值方法
曾经有人说 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 各种对象定义与对象取值方法的更多相关文章
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- Android零基础入门第61节:滚动视图ScrollView
原文:Android零基础入门第61节:滚动视图ScrollView 前面几期学习了ProgressBar系列组件.ViewAnimator系列组件.Picker系列组件和时间日期系列组件,接下来几期 ...
- web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】
http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...
- web前端(13)—— 了解JavaScript,JavaScript的引入方式
从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...
- WEB前端工程师整理的原生JavaScript经典百例
一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...
- Web前端基础怎么学? JavaScript、html、css知识架构图
以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...
- web前端学习之HTML CSS/javascript之一
前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...
- web前端学习(四)JavaScript学习笔记部分(6)-- js内置对象
1.JS内置对象-什么是对象 1.1.什么是对象: JavaScript中的所有事物都是对象:字符串.数值.数组.函数 每个对象带有属性和方法 JavaScript允许自定义对象 1.2.自定义对象: ...
- javascript对象转换,动态属性取值
$(document).ready(function(){ var exceptionMsg = '${exception.message }'; var exceptionstr = ''; //j ...
- Web前端开发规范【HTML/JavaScript/CSS】
前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...
随机推荐
- 07_读写文件open(filename, mode, encoding=None)
读写文件open(filename, mode, encoding=None) mode mode 权限 r 只读 w 只写(会从头开始覆盖覆盖写当前文件内容) a 追加写(从文件内容的末尾追加写内容 ...
- SQLserver查询用逗号隔开的字段中是否包含另一个字段的值
CHARINDEX(','+用逗号隔开的字段+',',','+是否包含的字段+',')>0 大于0则存在
- 在Linux系统下验证万兆网络(10Gbps)的性能和配置情况,可以通过多种方法来实现
在Linux系统下验证万兆网络(10Gbps)的性能和配置情况,可以通过多种方法来实现.以下是一些常用的步骤和工具: 1. 确认硬件支持 首先,确保您的计算机硬件支持万兆网络.这包括: 网卡:确认您的 ...
- javascript 陀螺仪加摄像头可以玩出AR效果
原文链接:https://blog.jijian.link/2020-09-08/js-ar/ 重要事情说三遍 此文章中的API接口,必须放在 https 协议下测试!浏览器APP必须开启摄像头权限! ...
- 『Plotly实战指南』--架构与设计理念
在数据科学和数据分析领域,数据可视化是理解数据和传达信息的关键环节. Python 作为最受欢迎的编程语言之一,拥有众多强大的可视化库,而 Plotly 无疑是其中的佼佼者. 本文将深入介绍 Plot ...
- Windows 提权-服务_未引用的服务路径
本文通过 Google 翻译 Unquoted Service Paths – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- halcon 入门教程(二)Blob分析(二值化,联通区域,分割区域,提取区域)保姆级教程
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/18781187 有兴趣可以多看其他的halcon教程 halcon 学习教程目录 OK,今天讲h ...
- 什么是RESTful 或 GraphQL?
RESTful 与 GraphQL 深度解析 在前端的开发过程中,相信 everyone 对 Get.POST 等请求方式都很熟悉,那么这些请求是归于哪种架构或者设计风格可能又不是很熟.现在在这简单的 ...
- REST API从木愣到够呆
目前准备写一个API服务,遵循REST规范,因为自己也是第一次接触这玩意,所以就以自我的认知和理解过程来记录,留爪. ##在REST里什么叫资源? 拿数据表为例: 现在有三张表:(此表非彼婊) sch ...
- HTB打靶记录-TheFrizz
信息收集 nmap -sV -sC -O 10.10.11.60 Nmap scan report for 10.10.11.60 Host is up (0.63s latency). Not sh ...