zoukankan      html  css  js  c++  java
  • JavaScript基本概念(对象)

    1.对象的分类

    • 内置对象:由ECMAScript规范定义的对象或类
    • 宿主对线:由浏览器定义的对象
    • 自定义对象:由运行中的Javascript代码创建的对象

    2.属性的分类

    • 自有属性:直接在对象中定义的属性
    • 继承属性:来自对象的原型对象中定义的属性

    3.创建对象的方式

    • 对象直接量
    • 通过new创建对象
    • 通过Object.create()创建对象(ECMAScript5),示例代码如下
    // 创建一个以普通对象为原型的对象
    var o1 = Object.create({x:1,y:2});
    // 创建一个没有原型的对线
    var o2 = Object.create(null);
    // 创建以Object.prototype为原型的对象
    var o3 = Object.create(Object.prototype);
    // 创建带属性x,y的对象
    var o4 = Object.create(object.prototype,{
      x: {value:1, configurable:true, enumerable:true, writable:true},
      y: {value:2, configurable:true, enumerable:true, writable:true}
    });
    

      

    4.检测对象是否拥有某属性

    // in运算符,检测对象所有(包括继承)属性,IE只有当可枚举属性时才返回true
    var  o = {x:1};
    'x' in o;      //true
    'y' in o;      //false
    'toString' in o    //true
    
    // o.hasOwnProperty(),检测对象的所有自有属性(不管是否可枚举)
    o.hasOwnProperty('x');     //true
    o.hasOwnProperty('toString');     //false
    
    // o.propertyIsEnumerable(),检测对象的所有可枚举自有属性
    o.propertyIsEnumerable('x');      //true
    Object.prototype.propertyIsEnumerable('toString')    //false
    

      

    5.枚举对象的属性

    • for/in : 可枚举对象所有的(包括继承)的所有可枚举属性
    • Object.keys() : 可枚举对象自有属性中的可枚举属性
    • Object.getOwnPropertyNames() : 可枚举对象自有属性中的所有属性(包括不可枚举的属性,但仅E5有效,E3没有任何办法获取对象的不可枚举属性)

     

    6.属性的特性

    数据属性的4个特性:值(value)、可写性(writable)、可枚举性(enumerable)和可配置性(configurable)

    存取器属性的4个特性:读取(get)、写入(set)、可枚举性(enumerable)和可配置性(configurable)

    // 调用Object.getOwnPropertyDescriptor()可以查看自有属性的特性
    // 返回 {value:1, writable:true, enumerable:true, configurable:true}
    Object.getOwnPropertyDescriptor({x:1},'x');
    // 返回undefined
    Object.getOwnPropertyDescriptor({}, 'x');
    
    设置属性的特性用Object.defineProperty()或Object.defineProperties(),如:
    var o = {};
    Object.defineProperty(o,'x',{value:1, writable:true, enumerable:true, configurable:true});    //这个函数没有返回值
    
    var p = Object.defineProperties({}, {
        x: {value:1, writable:true, enumerable:true, configurable:true},
        y: {get: function(){}, enumerable:true, configurable:true}
    });
    

      注:如果属性是不可配置的,则不可以修改属性的可枚举性和可配置性,可写性只能从true改成false。

     

    7.对象的三个属性

    查看原型属性

    // ECMAScript5
    var o = {};
    console.dir(Object.getPrototypeOf(o));    //Object.prototype对象
    
    // ECMAScript3
    console.dir(o.constructor.prototype);    //这个方法并不可靠,o.constructor是创建这个对象的构造函数
    
    // 判断一个对象是否是另一个对象原型,这个函数的功能非常像instanceOf
    var p = {x:1};
    var o = Object.create(p);
    p.isPrototypeOf(o);   //true
    Object.prototype.isPrototypeOf(o);    //true
    

      

    查看对象的类

    function classof(o) {
        if(o === null) return "Null";
        if(o === undefined) return "Undefined";
        //使用下面这条无法区分通过构造函数创建的对象
        //return Object.prototype.toString.call(o).slice(8,-1);
        //本人自己的想法
        return o.constructor.name;
    }
    

      

    可扩展性

    // 使用Object.isExtensible()判断对象是否可扩展
    // 使用Object.preventExtensions(),将对象转为不可扩展,一旦转成不可扩展的对象不能转换回可扩展。
    // 使用Object.seal()将对象转为不可扩展,且所有自有属性都设置成不可配置,可通过Object.isSealed()来检测对象是否封闭。
    // 使用Object.freeze()将对象冻结,除了具备seal的功能外还把属性设置成只读,可通过Object.isFrozen()来检测对象是否冻结
    

      

    8.序列化对象

    // JSON.stringify(o)将对象o转化为字符串
    // JSON.parse(o)将对象字符串o转化为对象
    

      

  • 相关阅读:
    EFCore实践教程三
    EFCore实践测试二
    EFCore实践测试一
    git学习3
    git学习2
    git学习1
    ABP学习
    autofac笔记
    时间计算本质理论3-平行宇宙,对未来的子线程计算
    时间计算本质理论2-时间计算速度的不同步
  • 原文地址:https://www.cnblogs.com/lijiazhan/p/4316324.html
Copyright © 2011-2022 走看看