关于JavaScript对象的理解


对象

理解对象

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

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

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

合并对象

它 是值 把源对象全部属性 复制到目标对象属性当中。前端工程师

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

这个方法接受一个目标对象和一个或多个源对象做为参数,而后将源对象的全部属性和自有属性 复制到目标对象当中。编辑器

「合并对象除了使用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() 方法,它接受两个参数。ui

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

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

console.log(Object.is(+00))   //true

var objA = {
    id:2
}

var objB = {
    id:2
}

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

对象的属性

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

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

数据属性

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

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

按时

注意:

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

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

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

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

参数为:

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

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

let obj = {
    code200,
    title'前端自学社区',
}

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

obj.code = 201


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

访问器属性

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

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

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

「实际开发中,这个两个属性不是必须的,看本身业务需求」

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

let obj = {
    code200,
    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 = {
    code200,
    title'前端自学社区',
}

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



React Hook | 必 学 的 9 个 钩子

Vue权限路由思考

Vue 组件通讯的 8 种方式

MYSQL经常使用操做指令

TypeScript学习指南(有PDF小书+思惟导图)




本文分享自微信公众号 - 前端自学社区(gh_ce69e7dba7b5)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索