JS对象和类

  • JS对象类别

    1. 内置对象 如Array Date Function
    2. 宿主对象 比如浏览器中的window
    3. 自定义对象 用户在代码中创建的
  • 对象的构成

    1. 属性

      按继承区分

      • 自有属性
      • 继承属性 对象原型中定义的属性

      按类别分

      • 数据属性
      • 存取器属性
        var o = {
            get name() {},
            set name(value) {},
        }
    2. 三个对象特性

      • 对象原型 prototype
      • 对象的类 class
      • 对象的拓展标记
  • 属性特性

    1. 数据属性特性 value,writable,enumerable,configurable
    2. 存取器属性 get,set,enumerable,configurable
    3. 属性描述符

      //返回 {value:1,writable:true,enumrable:true,configurable:true}
      Object.getOwnPropertyDescription({x:1},"x");
      
      //对于不存在的属性和继承属性返回undefined
    4. 设置属性特性

      var o = {};
      Object.defineProperty(o,"x",{value:1,writable:true,
                              enumrable:false,configurable:true})
      
      //修改为只读
      Object.defineProperty(o,"x",{writable:false});
      o.x = 2;//error
      
      //但是属性依然是可配置的,所以可以这样修改x的值
      Object.defineProperty(o,"x",{value:2}); 
  • 属性操作

    1. delete 删除属性,但是只能删除自由属性
    2. 检测属性

      //in操作符
      var o = {x:1};
      "x" in o;//会从自有属性和继承属性中判断
      
      o.hasOwnProperty("x");//只会检测自有属性
      
      o.propertyIsEnumerable("x");//检测自有属性,且可枚举性为true,可枚举性是属性特性之一
  • 对象原型

    每一个js对象都有一个原型对象(null以及Object.prototype除外)

    var a = new Object();
    var a = {};
    //两种方式的原型都是Object.prototype
    //此处的Object并不是 java等语言中 类的概念,而是Object构造函数

    原型对象是类的唯一标示

    var o = {x:1,y:1};
    
    function A {
    }
    A.prototype = o;
    
    function B {
    }
    B.prototype = 0;
    
    new B() instanceof A// true 虽然new A() 和 new B()是不同的构造函数产生的,但是他们的原型都是o

    Object.create() 一个静态函数,有两个参数,第一个为创建对象的原型

    var o1 = Object.create({x:1,y:2});//继承了属性x,y
    var o2 = Object.create(null);//创建一个没有原型的对象,没有任何方法,包括toString
    var o3 = Object.create(Object.prototype);//同 var a = {}
  • constructor 属性

    1. 每一个函数的prototype对象都有一个constructor属性

      var F = function f(){}
      var p = F.prototype;
      var c = p.constructor;
      c === F;
    2. 构造函数也一样

      var o = new F();//o 继承了 F.prototype
      o.constructor === F;//true 
  • 对象的可拓展标记

    Object.isExtensible(o);//判断对象是否可拓展
    Object.preventExtensions(o);//设置为不可拓展,该过程不可逆,但是给o的原型增加属性,o仍然可以继承这些属性
    
    Object.isSealed(o);
    Object.seal(o);//不可拓展,并设置自有属性为不可配置
    
    Object.isFrozen()
    Object.freeze();//不可拓展,并设置自有属性为不可配置,属性设置为只读,setter 属性不受影响
  • 对象序列化 就是转换成JSON字符串

    JSON.stringify(o);
    JSON.parse();
  • 类和类型

    typeof //对于对象都返回Object
    function classof(o) {
        return Object.prototype.toString.call(o).slice(8,-1);
    }//可以返回内置对象的具体类型 比如Date RegExp等

    以上两种方法都有局限性,那么如何获得自定义对象的类型呢

    1. 使用 instanceof
    2. constructor属性
      function typeAndValue(x) {
          if(x == null)return "";
          switch(x.constructor) {
              case Number:return "Number:"+x;
              case Complex:return "Complex:"+x;//处理自定义类型
          }
      }

你可能感兴趣的:(JS对象和类)