Object类型

描述

  • object类型对象是所有其他类型对象的父级

使用Object创建对象

/* 表示使用构造函数方式创建一个空对象 */
var obj1 = new Object();
console.log( obj1 );// 显示 {}


/* Object可以根据一个给定值创建一个对应类型的对象 */
var obj2 = new Object( 100 );// 创建一个number类型的对象
console.log( obj2 );// 显示 [Number: 100]
var obj3 = new Object( '啊哈哈' );// 创建一个string类型的对象
console.log( obj3 );// 显示 [String: '啊哈哈']

属性描述符

  • 表示对象的属性或方法的内部数据结构
  • 用于描述对象的值,或控制值的行为

    • 比如: 是否可修改 是否可删除 是否可枚举

属性描述符的分类

  • 数据描述符
  • 存取描述符

获取属性描述符

  • Object.getOwnPropertyDescriptor()方法
  • 通过该方法可以获取到指定属性或方法的属性描述符
  • 该方法接收两个参数

    • 第一个 - 需要查找属性的目标对象
    • 第二个 - 目标对象中需要查找的属性名称( string类型 )
  • 该方法会将查找的结果,以对象的方式返回
var obj = {
    ahh : '啊哈哈'
}
var ahh = Object.getOwnPropertyDescriptor( obj, 'ahh' );
console.log( ahh );
/* 显示 {
value: '啊哈哈', - 表示 属性或方法对应的值
writable: true, - 表示 是否可修改,值为boolean类型,true表示可以,false表示不可以,默认值为 false
enumerable: true, - 表示 是否可枚举,值为boolean类型,true表示可以,false表示不可以,默认值为 false
configurable: true  - 表示 是否可删除,值为boolean类型,true表示可以,false表示不可以,默认值为 false
} */

属性描述符的value属性

  • 可以对指定对象添加新属性或方法
  • 可以对指定对象中已有的属性或方法进行修改

Object.defineProperty()方法

  • 该方法接收三个参数

    • 第一个 - 表示指定的对象
    • 第二个 - 表示指定对象中的属性名称,字符串格式

      • 修改就填已存在的
      • 新增就直接写新名
    • 第三个 - 表示属性描述符,必须是对象格式 { }
/* 定义一个对象 */
var obj = {
    ahh : '啊哈哈'
}
/* 修改属性 */
console.log( obj.ahh );// 显示 啊哈哈
/* 对已有属性进行修改 */
Object.defineProperty( obj, 'ahh', {
    value : '哈哈啊'
} );
/* 显示修改后的属性 */
console.log( obj.ahh );// 显示 哈哈啊

/* 添加属性 */
console.log( obj );// 显示 { ahh: '哈哈啊' }
/* 添加新属性 */
Object.defineProperty( obj, 'ooo', {
    value : '哦哦哦',
    /*
        设置是否可枚举
         * 用于打印对象时可以正常显示新增的属性
         * 不设置可枚举时将无法显示新增属性,只显示原有属性
          * 显示 { ahh: '哈哈啊' }
     */
    enumerable : true
} );
/* 显示新增属性 */
console.log( obj );// 显示 { ahh: '哈哈啊', ooo: '哦哦哦' }
/* 调用新属性 */
console.log( obj.ooo );// 显示 哦哦哦
/*
    注意:
     * 通过Object.defineProperty()方法新增的属性
      * 该属性 - 不可修改 不可删除 不可枚举
     * 通过 对象名.属性名 = 属性值 的方法新增的属性
      * 该属性 - 可以修改 可以删除 可以枚举
 */

属性描述符的writable属性

  • 表示指定属性或方法是否可修改
  • 该属性值为boolean值

    • true - 表示可修改
    • false - 表示不可修改

Object.defineProperty()方法

  • 该方法接收三个参数

    • 第一个 - 表示指定的对象
    • 第二个 - 表示指定对象中的属性名称,字符串格式
    • 第三个 - 表示属性描述符,必须是对象格式 { }
/* 定义一个对象 */
var obj = {
    ahh : '啊哈哈'
}
/* 修改已有属性 */
Object.defineProperty( obj, 'ahh', {
    value : '哈哈啊',
    writable : false // 不可修改
} );
console.log( obj.ahh );// 显示 哈哈啊
/* 设置writable属性后在修改属性 - 不可修改 */
obj.ahh = '啊啊啊';
console.log( obj.ahh );// 显示 哈哈啊
/* 设置writable属性后在修改属性 - 可修改 */
Object.defineProperty( obj, 'ahh', {
    writable : true // 可修改
} );
obj.ahh = '啊啊啊';
console.log( obj.ahh );// 显示 啊啊啊

属性描述符的configurable属性

  • 表示指定属性或方法是否可枚举
  • 该属性值为boolean值

    • true - 表示可枚举
    • false - 表示不可枚举

Object.defineProperty()方法

  • 该方法接收三个参数

    • 第一个 - 表示指定的对象
    • 第二个 - 表示指定对象中的属性名称,字符串格式
    • 第三个 - 表示属性描述符,必须是对象格式 { }
/* 定义一个对象 */
var obj = {
    ahh : '啊哈哈'
}
Object.defineProperty( obj, 'ahh', {
    enumerable : false// 不可枚举
} );
console.log( obj.ahh );// 显示 啊哈哈
/*
    * 只能遍历对象中可被枚举的属性
      * for...in语句
      * keys()方法
    * 可以遍历对象中可枚举和不可枚举的属性
      * getOwnPropertyNames()方法
 */
/* for...in语句 */
for ( var i in obj ) {
    console.log( i );
}// 没有显示

/* keys()方法 */
var obj1 = Object.keys( obj );
console.log( obj1 );// 显示 []空数组

/* getOwnPropertyNames()方法 */
var obj2 = Object.getOwnPropertyNames( obj );
console.log( obj2 );// 显示 [ 'ahh' ]

属性描述符的configurable属性

  • 表示指定属性或方法是否可删除
  • 该属性值为boolean值

    • true - 表示可删除
    • false - 表示不可删除

Object.defineProperty()方法

  • 该方法接收三个参数

    • 第一个 - 表示指定的对象
    • 第二个 - 表示指定对象中的属性名称,字符串格式
    • 第三个 - 表示属性描述符,必须是对象格式 { }
/* 定义一个对象 */
var obj = {
    ahh : '啊哈哈'
}
/* 修改已有属性 */
Object.defineProperty(obj, 'ahh', {
    configurable : false // 不可删除
});
/* 删除ahh属性值 */
delete obj.ahh;
console.log(obj.ahh);// 显示 啊哈哈

Object.defineProperty(obj, 'ahh', {
    configurable : true // 可删除
});
/* 删除ahh属性值 */
delete obj.ahh;
/* 在调用已删除的属性会报错 */
console.log(obj.ahh);// 显示 TypeError: Cannot redefine property: ahh

属性描述符的存取器

/* 定义一个对象 */
var obj = {
    ahh : 'ahh'
}
/* 定义一个全局变量 */
var quanju;
Object.defineProperty(obj, 'ahh', {
    // 获取指定的属性值
    get : function(){// 当获取或访问当前属性时,会调用get方法
        /*
            类似于数据描述符中的value
            * get方法在被调用时,不能传递任何参数
            * get方法在被调用时,允许传递this关键字
              * this - 表示当前的目标对象(不能调用对象的当前目标属性)
          */
        return quanju;// 由于变量为初始化,调用时可能结果为 undefined
    },
    /*
        set方法用于定义当前目标属性的修改作用
        * 该方法接收唯一的一个参数 -> 作为当前目标属性的新的值
        * 通过属性修改操作指定的新的值 -> 作为形参对应的实参
     */
    set : function(canshu){
        /*
            set方法在被调用时,允许传递this关键字
              * this - 表示当前的目标对象(不能调用对象的当前目标属性)
         */
        quanju = canshu;
    }
});
console.log(obj.ahh);// 显示 undefined

obj.ahh = '啊啊啊';
console.log(obj.ahh);// 显示 啊啊啊

禁止扩展

  • 表示不能添加新的属性或方法

Object.preventExtensions()方法

  • 表示禁止扩展

Object.isExtensible()方法

  • 表示用于判断指定对象是否可扩展

    • true - 表示可扩展
    • false - 表示不可扩展
/* 定义一个空对象 */
var obj = {};
/* 设置禁止扩展 */
Object.preventExtensions( obj );
/* 添加新属性 */
obj.ahh = '啊哈哈';
console.log( obj );// 显示 {}空对象
/*
    使用Object.defineProperty()方法进行新增属性会报错
    * TypeError: Cannot define property:name, object is not extensible.
 */
Object.defineProperty(obj, 'ahh', {
    value : '啊哈哈'
});
console.log( obj );// 显示 Cannot define property ahh, object is not extensible

/* 判断指定对象是否可扩展 */
var panduan = Object.isExtensible( obj );
console.log( panduan );// 显示 false

密封对象

  • 表示不能添加新的属性或方法,也不能对已有的属性或方法进行修改

Object.seal()方法

  • 表示密封对象

Object.isSealed()方法

  • 表示用于判断指定对象是否密封

    • true - 表示密封
    • false - 表示没密封
var obj = {
    ahh : '啊哈哈' // 表示可修改
};
console.log( Object.getOwnPropertyDescriptor( obj, 'ahh' ) );

/*
    将该对象进行密封
    1.不能为该对象新增属性或方法
    2.不能修改该对象的属性或方法的描述符
      * configurable
      * enumerable
  */
/* 密封对象 */
Object.seal( obj );
console.log( Object.getOwnPropertyDescriptor( obj, 'ahh' ) );

/* 判断指定对象是否密封 */
var panduan = Object.isSealed( obj );
console.log( panduan );// 显示 true

冻结对象

  • 表示禁止对指定对象的任何修改操作

Object.freeze()方法

  • 表示冻结对象

Object.isFrozen()方法

  • 表示用于判断指定对象是否冻结

    • true - 表示冻结
    • false - 表示没冻结
var obj = {
    ahh : '啊哈哈'
}
/* 冻结对象 */
Object.freeze( obj );
/*
    对已经冻结的对象使用Object.defineProperty()方法进行操作
     * 会报错
     * TypeError: Cannot define property age, object is not extensible
 */
Object.defineProperty( obj, 'age', {
    value : 18
} );
console.log( obj );//显示 Cannot define property age, object is not extensible

/* 判断指定对象是否密封 */
var panduan = Object.isFrozen( obj );
console.log( panduan );// 显示 true

蔡志远
9 声望5 粉丝