对象

1.1、除了字符串、数字(直接量或字面量)、布尔类型、null和underfined外,JavaScript的值都是对象。

尽管不是对象,但字符串、数字和布尔值经常在进行调用的时候被包装起来,所以这些数据类型更像是不可变的对象。如

'hello'.replace('h', 'H');   //,实际上是 String('hello').replace('h', 'H')

1.2、对象的属性特性

ECMAScript5

  •   writable         可写
  •   configurable  可配置
  •   enumerable   可枚举

1.3、对象特性

  • prototype     原型对象
  • class         类标识,字符串
  • isExtensible  布尔型,可否扩展

1.4、三种JavaScript对象和两种属性

  • 内置对象  数组、函数、日期、正则表达式等
  • 宿主对象  HTMLElement对象等表示宿主结构的对象,实际上是JavaScprit迁入的宿主对象的内置对象
  • 自定义对象  通过动态代码创建的对象
  • 自有属性  对象中定义的属性
  • 继承属性  从原型对象中继承的属性

1.5、对象创建

  • 对象直接量  {key : value, key1 : value1},在IE7及之下的版本中直接量不可用逗号结尾,其他版本和其他主流浏览器中将忽略这个逗号
  • new  new Object();
  • 原型对象(prototye)  直接用树形结构,二叉树来理解即可,或者就是族谱,你是你爸妈生的,你的原型对象是你爸妈,往上可以一直迭代到初代。
  • Object.create  ECMAScript5中定义用来创建基于prototype的新对象。

2.1、属性的查询与设置

  • 通过.和[]
  • 任何时候对属性的设置都是对象属性的设置,而不是原型对象的属性设置,原型对象的属性只有在查询时被读取,相当于一个默认值

2.2、delete

  • 只是断开属性之间的引用关系,并没有去操作属性的属性。如 delete o.one; 如果o.one里面还有其他属性,并不被删除,只是无法再通过o.one访问
  • 在严格模式下 delete在某些情况下会报错(错误标识、不可配置的属性)

2.3、检测属性

  • in
  • hasOwnProperty()
  • propertyIsEnumerable()
  • !== underfined

2.4、遍历属性

  • for in
  • Object.keys()
  • Object.getOwnPropertyNames()

2.5、属性描述符

  • Object.getOwnPropertyDescriptor()
  • {writable : false,  configurable : false, enumerable : false, value : null}
  • Object.defineProperty() 、 Object.defineProperties()

       - Object.defineProperty(object, 'name', {writable : false,  configurable : false, enumerable : false, value : null})

     - Object.defineProperties(object, {

        one : {writable : false,  configurable : false, enumerable : false, value : 1},

      two : {writable : false,  configurable : false, enumerable : false, value : 2}

              })

  1. 不可扩展的,可编辑已有属性,不可添加新属性
  2. 不可配置的,不能修改可配置属性和可枚举属性
  3. 存取器不可配置,则不可修改get和set,也不能转换成数据属性
  4. 数据属性不可配置,不能转换成存取器属性,可写性可从true改成false,不能反向转换
  5. 数据属性不可配置且不可写的属性不能修改,可配置不可写的属性值可以修改(可以修改成可写,修改完属性再配置成不可写)。

扩展了一下一些属性,把代码贴上

Object.defineProperties && Object.defineProperties(Object.prototype, {
  'extend': {
    writable: true,
    enumerable: false,
    configurable: true,
    value: function (o) {
      // 得到所有的自有属性
      var names = Object.getOwnPropertyNames(o),
      name = null;
      for (var i = 0; i < names.length; i++) {
        name = names[i];
        // 如果属性已经存在,跳过
        if (name in this) continue;
        // 获取属性描述符
        var desc = Object.getOwnPropertyDescriptor(o, name);
        // 用它给this创建一个属性
        Object.defineProperty(this, name, desc);
      }
    }
  },
  'class': {
    enumerable: true,
    configurable: true,
    get : function () {
      return Object.prototype.toString.call(this).slice(8, -1);
    }
  }
});

2.6、可扩展性

  • Object.isExtensible()  是否可扩展
  • Object.preventExtensions()  转换成不可扩展
  • Object.seal()  封闭,会将所有自有属性都转换成不可配置的,已经设置为不可写的将无法再更改(无法解封)
  • Object.isSealed()  是否封闭
  • Object.freeze()  冻结所有属性,比seal更严格,把可写的属性也变成不可写的,存取器不受影响
  • Object.isForzen()  是否冻结

3.1、JSON

  • JSON.stringify()  return string
  • JSON.parse()  return json object
原文地址:https://www.cnblogs.com/gabin/p/3808616.html