控制对象属性的API

79 阅读1分钟
hasOwnProperty

个人笔记,方便自己看,另外感谢后盾人向军老师,笔记借鉴 后盾人。 不能检测原型链上是否继承该属性,有则返回ture

如果想判断该对象是否能使用该属性可以使用 in

        let a = ['houdunren'];
        console.log(a.hasOwnProperty('concat'))
        console.log('concat' in a);
        console.log(a)
Object.assgin(a,b);

合并两个对象的属性,有相同属性名时,由b的值替代a值。

    <script>
        let a = {
            name: 'why',
        }
        function upload(params) {
            let b = Object.assign(params, a)
            console.log(JSON.stringify(b))  //JSON.stringify()将对应的值字符串化  JSON.parse()还原
        }
        upload({ age: 11, name: 'why1' });
    </script>
Object.keys(),Object.values(), Object.entries()
    <script>
        let hd = {
            name: 'why',
            age: 11
        }
        console.log(Object.keys(hd))
        console.log(Object.values(hd))
        console.log(JSON.stringify(Object.entries(hd), null, 3))
    </script>
getOwnPropertyDescripter() 和 defineProperty()

Object.getOwnPropertyDescriptor()用来查看对象属性的描述

let a = {
      name: 'why',
      age: 11,
}
console.log(JSON.stringify(Object.getOwnPropertyDescriptor(a, 'name'), null, 2))
特性说明默认值
configurable能否使用delete、能否需改属性特性、或能否修改访问器属性true
enumerable对象属性是否可通过for-in循环,或Object.keys() 读取true
writable对象属性是否可以修改true

设置特性:

使用Object.defineProperty 方法修改属性特性,通过下面的设置属性name将不能被遍历、删除、修改。

"use strict";
const user = {
  name: "why"
};
Object.defineProperty(user, "name", {
  value: "why",
  writable: false,
  enumerable: false,
  configurable: false
});

使用 Object.defineProperties 可以一次设置多个属性,具体参数和上面介绍的一样。

"use strict";
let user = {};
Object.defineProperties(user, {
  name: { value: "why", writable: false },
  age: { value: 18 }
});
console.log(user);
user.name = "why"; //TypeError
禁止添加属性preventExtensions
        let a = {
            name: 'why',
            age: 11,
        }
        // console.log(JSON.stringify(Object.getOwnPropertyDescriptor(a, 'name'), null, 2))
        a.hobby = 'js';
        Object.preventExtensions(a);
        a.sex = 'nan';
        console.log(a)  //{name: 'why', age: 11, hobby: 'js'}
        console.log(Object.isExtensible(a));//false
Object.seal()

方法封闭一个对象,阻止添加新属性并将所有现有属性标记为 configurable: false

        let a = {
            name: 'why',
            age: 11,
        }
        Object.seal(a);
        a.sex = 'man' //sex属性并没有被添加进去
        console.log(JSON.stringify(Object.entries(a), null, 2));
        console.log(Object.isSealed(a));//true
冻结对象

Object.freeze冻结对象后不允许添加、删除、修改属性,writable、configurable都标记为false

        let a = {
            name: 'why',
            age: 11,
        }
        Object.freeze(a);
        a.name = 'wy';
        console.log(a);//{name: 'why', age: 11}
        console.log(Object.isFrozen(a));//true

\