关于JavaScript 对象的理解

海军
• 阅读 1260

关于JavaScript 对象的理解

对象

理解对象

ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。

我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中的值可以是数据或函数。

每个对象都是基于一个引用类型创建的,即创建自定义对象的最简单方式就是创建一个Object的实例,然后再为它添加属性和方法

合并对象

它 是值 把源对象所有属性 复制到目标对象属性当中。

ES6 中提供了 Object.assign() 来合并对象。

这个方法接受一个目标对象和一个或多个源对象作为参数,然后将源对象的所有属性和自有属性 复制到目标对象当中。

合并对象除了使用Object.assign, 还可以使用 ... 对象扩展符 来简化合并对象

s

注意:

  • Object.assign() 是浅复制,如果多个源对象之间合并出现,重复属性时,会取最后一个属性的值。
// ...

var a = {
    title:'初级前端工程师'
}

var b = {
    address: '北京中关村'
}

var c = { ...a, ...b}
console.log(c) 
// { title: '初级前端工程师', address: '北京中关村' }





//Object.assign()
var job = {
    title:'高级前端工程师'
}

var salary = {
    wage: '22w'
}

var HaiJun = {}

console.log(Object.assign(HaiJun,a,job,salary)) 
//{ title: '高级前端工程师', wage: '22w' }

对象标识类型及相等判断

ES6 中提供 了 Object.is() 方法,它接受两个参数。

console.log(Object.is(1,"1")) //false

console.log(Object.is({},{})) //false

console.log(Object.is(+0, 0))   //true

var objA = {
    id:2
}

var objB = {
    id:2
}

console.log(Object.is(objA.id,objB.id)) //true

对象的属性

ECMA-262第5版在定义了只有内部才用的特性时,描述了属性的各种特征,这些特征是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们。

JavaScript 中,对象的属性类型 为: 数据属性访问器属性.

数据属性

定义: 数据属性包含一个数据值的位置,这个位置可以读取和写入值,可通过对象直接定义的属性。数据属性有四个描述其行为的特性。

它有 4 个特定行为来约束属性行为

按时

注意:

  • 在调用 Object.defineProperty() 时,如果不指定 属性的默认行为的话,它的 3 个行为 都 为 false .

实际开发中,修改属性默认行为场景很少,但学习属性的行为 有助于 理解对象。

属性
[[Configurable]] 表示是否可以通过 delete 删除对象属性,默认为 true
[[ Enumberable ]] 表示 对象属性是否 可以 通过 for-in 来循环。默认为true
[[ Writable]] 表示 对象属性的值是否可以修改,默认为true
[[Value ]] 表示 对象属性的实际值。
如何修改对象属性默认行为

通过 Object.defineProperty() 来修改属性默认行为

参数为:

  • 目标对象
  • 要修改的对象属性
  • 一个描述符对象 (这个对象是用来管理属性默认行为的)

该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

let obj = {
    code: 200,
    title: '前端自学社区',
}

Object.defineProperty(obj,"code",{
    writable: false  //禁止修改对象属性 code
})

obj.code = 201


console.log(obj)  // 返回{ code: 200, title: '前端自学社区' }

访问器属性

它 包含 一个 setter 函数 和 getter 函数,用来返回属性值和修改属性的值.

当属性被修改时,获取调用setter 函数。

当属性要获取值时,会调用getter 函数。

实际开发中,这个两个属性不是必须的,看自己业务需求

如果一个属性的值变化,影响到另一个属性的值的时候,就可以使用 settter getter 来实现。

let obj = {
    code: 200,
    title: '前端自学社区',
}

Object.defineProperty(obj,"mounth",{
    set(newValue){
        if(newValue >3) {
            this.code = 400
        }
    },
    get(){
        return this.code
    }
})
obj.mounth = 4
console.log(obj)  //{ code: 400, title: '前端自学社区' }

读取属性的行为

要读取属性的特性,必须使用ECMAScript5的:Object.getOwnPropertyDescriptor() 来获取对象属性的行为。

该函数接受两个参数:

  • 目标对象
  • 要获取的属性

该方法返回指定对象上一个自有属性对应的属性描述符。

let obj = {
    code: 200,
    title: '前端自学社区',
}

const des = Object.getOwnPropertyDescriptor(obj,'code')
console.log(des) 
//{ value: 200, writable: true, enumerable: true, configurable: true }
console.log(des.writable) //true

结语

❤️关注+点赞+收藏+评论+转发❤️,原创不易,鼓励笔者创作更好的文章

关注公众号 “前端自学社区”,即可获取更多前端高质量文章!

关注后回复关键词“加群”, 即可加入 “前端自学交流群”,共同学习进步。

关注后添加我微信拉你进技术交流群

欢迎关注公众号,更多精彩文章只在公众号推送

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章带你了解JavaScript Object 对象
一、概念JavaScript原生提供Object对象(注意起首的O是大写),介绍该对象原生的各种方法。JavaScript的所有其他对象都继承自Object对象,即那些对象都是Object的实例。二、Object()Object本身是一个函数,可以当作工具方法使用,将任意值转为对象。这个方法常用于保证某个值一定是对象。如果参数为空(或者为undefi
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
Easter79 Easter79
3年前
Vue 3 高阶指南之 WeakMap
高阶指南之WeakMap「WeakMap」对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。在JavaScript里,mapAPI可以通过使其四个API方法共用两个数组(一个存放键,一个存放值)来实现。给这种map设置值时会同时将键和值添加到这两个数组的末尾。从
Stella981 Stella981
3年前
JavaScript原型深入浅出
不学会怎么处理对象,你在JavaScript道路就就走不了多远。它们几乎是JavaScript编程语言每个方面的基础。事实上,学习如何创建对象可能是你刚开始学习的第一件事。对象是键/值对。创建对象的最常用方法是使用花括号{},并使用点表示法向对象添加属性和方法。letanimal{}animal.name
Stella981 Stella981
3年前
JavaScript的 基本数据类型
第一:Javascript对象是第二:Javascript中第三:Javascript的对象是数据;第四:JavaScript中的对象可以简单理解成"名称:值"对(name:value)。名称(name):"名称"部分是一个JavaScript字符串参考https://www
Wesley13 Wesley13
3年前
JS原型、原型链深入理解
原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对
Stella981 Stella981
3年前
JavaScript 基于原型链的继承
JavaScript对象是动态的属性“包”(指其自己的属性)。JavaScript对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。遵循ECMAScript标准,someObject.Prototype
Stella981 Stella981
3年前
JavaScript基础2
普通的JavaScript对象是命名值的无序集合,JavaScript同样定义了一种特殊的对象数组array,表示带编号的值的有序集合,JavaScript为数组定义了专用的语法,使得数组具有区别于普通对象而独有的行为特性JavaScript还定义了另一种特殊对象函数,函数是具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码并返回运算结
Easter79 Easter79
3年前
Spring两种依赖注入方式的比较
我们知道,Spring对象属性的注入方式有两种:设值注入和构造注入。先看代码:  假设有个类为People,该对象包含三个属性,name和school还有age,这些属性都有各自的setter和getter方法,还有一个包含这三个属性的构造方法。如果用spring来管理这个对象,那么有以下两种方式为People设置属性:  1.设值注入:
海军
海军
Lv1
海军,专注Web前端领域开发,分享开发经验与最新前端技术。 微信公众号: 前端自学社区
文章
27
粉丝
11
获赞
33