Skip to content

JavaScript 对象 #41

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
trayvonRen opened this issue Jan 30, 2020 · 0 comments
Open

JavaScript 对象 #41

trayvonRen opened this issue Jan 30, 2020 · 0 comments

Comments

@trayvonRen
Copy link

读书笔记
📝《JavaScript 高级程序设计》
一个 Javascript 对象就是键和值之间的映射。键是一个字符串(或者 Symbol) ,值可以是任意类型的值。

属性类型

数据属性
数据属性是键值对,并且每个数据属性拥有下列特性( attribute )
数据属性的特性(Attributes of a data property)

特性 数据类型 描述 默认值
[[Value]] 任何Javascript类型 包含这个属性的数据值 undefined
[[Writable]] Boolean 如果该值为 false,则该属性的 [[Value]] 特性 不能被改变。 true
[[Enumerable]] Boolean 如果该值为 true,则该属性可以用 for...in 循环来枚举 true
[[Configurable]] Boolean 如果该值为 false,则该属性不能被删除,并且 除了 [[Value]] 和 [[Writable]] 以外的特性都不能被改变 true

对于这样一个直接定义的属性,就是一个数据属性

    let person = {
        name: 'rcw'
    }

可以使用 Object.defineProperty() 修改属性的特性

    let person = {
    	name: 'old'
    }
    Object.defineProperty(person, 'name', {
    	value: 'new'
    })
    console.log(person.name) // new

注意
在把 [[Configurable]] 设置为 false 之后,除了 [[Value]] 和 [[Writable]] 以外的特性都不能被改变,否则就会报错

    let person = {
    	name: 'old'
    }
    Object.defineProperty(person, 'name', {
    	configurable: false
    })
    Object.defineProperty(person, 'name', {
    	enumerable: false
    })
    //Uncaught TypeError: Cannot redefine property: name
    // at Function.defineProperty (<anonymous>)

访问器属性
访问器属性有一个或两个访问器函数 (get 和 set) 来存取数值,并且有以下特性
访问器属性的特性

特性 类型 描述 默认值
[[Get]] 函数对象或者 undefined 该函数使用一个空的参数列表,能够在有权访问的情况下读取属性值。 undefined
[[Set]] 函数对象或者 undefined 该函数有一个参数,用来写入属性值。 undefined
[[Enumerable]] Boolean 如果该值为 true,则该属性可以用 for...in 循环来枚举。 true
[[Configurable]] Boolean 如果该值为 false,则该属性不能被删除,并且不能被转变成一个数据属性。 true

访问器属性不能直接定义,必须用 Object.defineProperty()

    let person = {
    	_name: 'old'
    }
    Object.defineProperty(person, 'name', {
    	get () {
    		return this._name
    	},
    	set (val) {
    		this._name = val
    	}
    })

对象的方法

getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)

    let person = {
    	_name: 'old'
    }
    Object.defineProperty(person, 'name', {
    	get () {
    		return this._name
    	},
    	set (val) {
    		this._name = val
    	}
    })
    console.log(Object.getOwnPropertyDescriptor(person, '_name'))
    //configurable: true
    //enumerable: true
    //value: "old"
    //writable: true
    console.log(Object.getOwnPropertyDescriptor(person, 'name'))
    //configurable: false
    //enumerable: false
    //get: ƒ ()
    //set: ƒ (val)

Object.freeze()
Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

    'use strict'
    const obj = {
        prop: 42
    };

    Object.freeze(obj);

    obj.prop = 33;
    // Throws an error in strict mode

    console.log(obj.prop);
    // expected output: 42

Object.isFrozen()
Object.isFrozen()方法判断一个对象是否被冻结。

    const obj = {
        prop: 42
    };

    Object.freeze(obj);

   	Object.isFrozen(obj);// true

Object.preventExtensions()
Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。

    const obj = {
        prop: 42
    };

   Object.preventExtensions(obj);
   obj.newAtr = 1
   //Uncaught TypeError: Cannot add property newAtr, object is not extensible

Object.isExtensible()
方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。

    const obj = {
        prop: 42
    };

    Object.preventExtensions(obj);
    Object.isExtensible(obj);//false

参考资料

MDN: 数据类型
《JavaScript 高级程序设计》

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant