6JS对象

6.1对象简介

对象是JavaScript的基本数据类型。对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。对象也可看做是属性的无序集合,每个属性都是一个名/值对。属性名是字符串,因此我们可以把对象看成是从字符串到值的映射。这种基本数据结构还有很多种叫法,有些我们已然非常熟悉,比如"散列"(hash)、"散列表"(hashtable)、"字典"(dictionary)、"关联数组"(associative array)。然而对象不仅仅是字符串到值的映射,除了可以保持自有的属性,JavaScript对象还可以从一个称为原型的对象继承属性。对象的方法通常是继承的属性。这种"原型式继承"(prototypal inheritance)是JavaScript的核心特征。

JavaScript对象是动态的------可以新增属性也可以删除属性------但它们常用来模拟静态对象以及静态类型语言中的"结构体"(struct)。有时它们也用做字符串的集合(忽略名/值对中的值)。

除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象。

对象最常见的用法是创建(create)、设置(set)、查找(query)、删除(delete)、检测(test)和枚举(enumerate)它的属性。

每个属性有一些与之相关的"属性特征"(property attribute):·可写(writable attribute),·可枚举(enumerable attribute),·可配置(configurable attribute).

对象的三个相关的对象特性: 对象的原型(prototype)·对象的类(class)·对象的扩展标记(extensible flag)。

对象的分类: ·内置对象(native object)·宿主对象(host object)·自定义对象(user-defined object)。

属性分类: 自有属性(own property)·继承属性(inherited property)

6.2创建对象

可以通过对象直接量、关键字new和 object.create( )来创建对象。

6.2.1 对象直接量

象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。

对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。

6.2.2 通过new创建对象

new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数称做构造函数(constructor),构造函数用以初始化一个新创建的对象。JavaScript语言核心中的原始类型都包含内置构造函数。

6.2.3 原型

第三种对象创建技术之前,我们应当首先解释一下原型。每一个JavaScript对象(null除外)都和另一个对象相关联。"另一个"对象就是我们熟知的原型,每一个对象都从原型继承属性。

6.2.4 Object.create()

Object.create()是一个静态函数,而不是提供给某个对象调用的方法。示例:

6.3 查询和设置属性

4.4节已经提到,可以通过点(.)或方括号(\[\])运算符来获取属性的值。

6.3.1 作为关联数组的对象

object.property 和 object"property". \[\]的引用,可以在程序运行期间修改和创建。

6.3.2 继承

例子:

6.3.3 属性访问错误

属性访问表达式并不会返回或设置值。

6.4删除属性

delete运算符(见4.13.3节)可以删除对象的属性。它的操作数应当是一个属性访问表达式。delete运算符只能删除自有属性,不能删除继承属性。在严格模式中,delete后跟随一个非法的操作数(比如x),则会报一个语法错误,因此必须显式指定对象及其属性。

6.5测试/检测属性

测试队形属性是否有一个给定名字的属性。

可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成。

in运算符的左侧是属性名(字符串),右侧是对象。

对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性(enumerable attribute)为true时它才返回true。

6.6 枚举属性

通常使用for/in循环遍历。

两个用以枚举属性名称的函数。第一个是Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。

第二个枚举属性的函数是Object.getOwnPropertyNames(),它和Ojbect.keys()类似,只是它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。

6.6.1 属性枚举顺序

6.7扩展对象

把一个对象的属性复制到另一个对象上,是一个常见的操作。可以代码实现,由于太常用增加了Object.assign()的功能。

6.8序列化对象

对象序列化(serialization)是指将对象的状态转换为字符串,也可将字符串还原为对象。函数JSON.stringify()和JSON.parse()是一对相反的操作。

JSON语法是JavaScript语法的子集。

6.9 对象方法

toString()方法,toLocaleString()方法,toJSON()方法,valueOf()方法

6.10 对象字面量扩展语法

6.10.1 简写属性

6.10.2 计算的属性名

6.10.3 符号作为属性名

6.10.4 扩展操作符

6.10.5简写方法

6.10.6 属性的获取方法与设置方法

6.11 小结

对象相关概念, 如可枚举和自有属性

对象字面量语法

读取,写入,删除,枚举和检查对象属性

继承, object.creat()方式继承。

object.assign()从一个对象向两一个对象复制属性

所有不是原始值的都是对象。包括数组和函数。

相关推荐
sunny.day3 天前
js原型与原型链
开发语言·javascript·原型模式·js原型链
UXbot4 天前
AI网页开发工具能替代工具吗?5大平台对比
前端·人工智能·低代码·ui·原型模式·web app
weixin_307779134 天前
从“大海捞针”到“主动推理”:AI如何重塑云原生故障诊断的根因链
开发语言·人工智能·算法·自动化·原型模式
swordbob4 天前
prototype 注入到 singleton 里,prototype是否还是线程安全的
安全·spring·单例模式·原型模式
isNotNullX5 天前
企业数据中台建设,ETL工具选错了会踩哪些坑?
数据仓库·etl·原型模式
半个烧饼不加肉5 天前
JS 底层探究-- 普通函数和构造函数
开发语言·javascript·原型模式
折哥的程序人生 · 物流技术专研6 天前
Java 23 种设计模式:从踩坑到精通 | 原型模式 —— 克隆对象,深拷贝与浅拷贝的坑你踩过吗?
java·设计模式·架构·原型模式·单一职责原则
ourenjiang8 天前
【学习设计模式】原型模式
学习·设计模式·原型模式
迷藏49410 天前
Python+DuckDB:轻量级BI流水线实战
java·开发语言·python·原型模式
J2虾虾14 天前
Spring AI Alibaba - 检索增强生成(RAG)
人工智能·spring·原型模式