【对象详解】

本文探讨了JavaScript中对象的声明方式(var和new Object)、类型判断(typeof和instanceof)、属性组织与描述符(enumerable、writable和configurable)、不变性操作(preventExtensions、seal和freeze),以及对象遍历和自定义迭代器。讲解了对象如何通过属性存储数据,以及如何通过属性描述符控制其可枚举性和可修改性。
摘要由CSDN通过智能技术生成

1.语法

声明形式(字面形式):var obj = {a:1,b:2};
构造形式:vao obj = new Object(); obj.a=1;

2.类型

:typeof :判断变量地址的机器码,前三位为0,则返回 Object, null机器码全是0,故返回Object;
: instanceof:检测右边变量构造函数的prototype属性是否在左边对象实例的原型链上(右边变量是否在左边变量原型链上),若是则返回true;
: Object.prototype.tostring.call():toString() 方法返回一个表示该对象的字符串,如下图:
在这里插入图片描述
注:const str = ‘hello’; // 这不是一个对象,而是字面量,如要在该字面量上执行操作,语言会自动将其转为String对象。
const str = new String(‘hello’); // 这是一个String对象。

3.内容

对象的内容是由属性(值)构成的,存储在对象容器内部的是这些属性的名称,它们指向这些值存储的位置。

4.属性描述符

Object.getOwnPropertyDescriptot():获取对象指定自有属性的属性描述符
在这里插入图片描述
①:enumerable:枚举。当enumerable为false,该属性不可出现在对象属性的遍历中。
在这里插入图片描述
Object.keys():返回可枚举属性;
Object.getOwnPropertyNames():返回所有属性;
obj.propertyIsenumerrable(‘属性名’):返回属性是否可枚举,不检查原型链。
在这里插入图片描述
②:writable:是否可修改属性的值。当writable为false时,不可修改属性的值。
在这里插入图片描述
③:configurable:属性是否可配置。若为true,可用defineProperty()来修改属性描述符;若为false,仍可把writeble改为false,但不能由false改为true,并且delete obj1.a无效;
在这里插入图片描述

5.不变性

var obj = {a:‘hello’}

①:禁止扩展 :Object.preventExtensions(obj)。调用该方法后,不可给对象添加新属性,原有属性的属性值可修改可删除。
在这里插入图片描述
②:密封:Object.seal(obj)。实际为调用preventExtensions(),会将现有属性都标记为configurable:false,故密封后不能添加新属性,也不能配置或删除原有属性。
在这里插入图片描述
③:冻结 Object.freeze(obj)。实际会调用Object.seal()并把所有数据访问属性标记为writable:false,这样就无法修改它们的值
在这里插入图片描述

6.存在性

在这里插入图片描述

7.遍历

for in :遍历对象可枚举属性;
for of:遍历有内置@iterator,如数组:
在这里插入图片描述
一般对象没有内置的@@iterator,故不可用for of 遍历对象。
在这里插入图片描述
当然,我们也可以给对象定义@@iterator,如下:

 var obj = {
      a: '嘻嘻',
      b: '哈哈',
      [Symbol.iterator]: function () {
        const _this = this;
        const _keys = Object.keys(_this);
        let _index = 0;
        return {
          next: function () {
            return {
              value: obj[_keys[_index++]],
              done: _index > _keys.length
            }

          }
        }
      }
    }

    // 或通过Object.defineProperty()添加
    Object.defineProperty(obj, Symbol.iterator, {
      value: function () {
        const _this = this;
        const _keys = Object.keys(_this);
        let _index = 0;
        return {
          next: function () {
            return {
              value: obj[_keys[_index++]],
              done: _index > _keys.length
            }
          }
        }
      }
    })


    for (const val of obj) {
      console.log(val); // '嘻嘻','哈哈'
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值