zoukankan      html  css  js  c++  java
  • javascript对象

    定义一个对象

    能够使用对象直接量

    var o = {name: 'hello'};
    

    键名加不加引號都能够,可是假设键名不是合法标识符。就必须加引號。

    对象的属性之间用逗号分隔,ECMAScript 5规定最后一个属性后面能够加逗号(trailing comma)。也能够不加。可是,ECMAScript 3不同意加入逗号。所以假设要兼容老式浏览器(比方IE 8)。那就不能加这个逗号。

    JavaScript原生提供一个Object对象(注意起首的O是大写),全部其它对象都继承自这个对象。Object本身也是一个构造函数。能够直接通过它来生成新对象。

    var o = new Object(); // {}
    

    Object作为构造函数使用时,能够接受一个參数。假设该參数是一个对象。则直接返回这个对象。假设是一个原始类型的值,则返回该值相应的包装对象。

    也能够使用Object.create()

    var o3 = Object.create(null);
    

    读写属性

    假设使用方括号运算符,键名必须放在引號里面。否则会被当作变量处理。可是,数字键能够不加引號,由于会被当作字符串处理。

    方括号运算符内部能够使用表达式,点号不行

    o['hello' + ' world']
    o[3+3]
    

    使用in运算符检查属性是否声明

    查看一个对象本身的全部属性,能够使用Object.keys方法

    var o = {
      key1: 1,
      key2: 2
    };
    
    Object.keys(o);
    // ["key1", "key2"]
    

    删除一个属性。须要使用delete命令

    一旦使用delete命令删除某个属性。再读取该属性就会返回undefined,并且Object.keys方法返回的该对象的全部属性中。也将不再包括该属性

    假设删除一个不存在的属性,delete不报错,并且返回true

    仅仅有一种情况,delete命令会返回false。那就是该属性存在。且不得删除

    var o = Object.defineProperty({}, "p", {
            value: 123,
            configurable: false
    });
    
    o.p // 123
    delete o.p // false
    

    能够用in运算符推断。一个全局变量是否存在

    // 假设变量x没有定义
    
    // 写法一:报错
    if (x){ return 1; }
    
    // 写法二:不对
    if (window.x){ return 1; }
    
    // 写法三:正确
    if ('x' in window) { return 1; }
    

    上面三种写法之中,假设x不存在。第一种写法会报错;假设x的值相应布尔值false(比方x等于空字符串)。另外一种写法无法得到正确结果;仅仅有第三种写法,才干正确推断变量x是否存在。

    in对继承的属性也返回true


    Object对象的方法

    Object

    Object本身当作工具方法使用时,能够将随意值转为对象。当中。原始类型的值转为相应的包装对象

    Object.keys(),Object.getOwnPropertyNames()

    Object.keys方法和Object.getOwnPropertyNames方法非常类似。一般用来遍历对象的属性。它们的參数都是一个对象,都返回一个数组。该数组的成员都是对象自身的(而不是继承的)全部属性名。

    它们的差别在于,Object.keys方法仅仅返回可枚举的属性(关于可枚举性的详解见后文)。Object.getOwnPropertyNames方法还返回不可枚举的属性名。

    Object.observe()

    Object.observe方法用于观察对象属性的变化

    var o = {};
    
    Object.observe(o, function(changes) {
      changes.forEach(function(change) {
        console.log(change.type, change.name, change.oldValue);
      });
    });
    
    o.foo = 1; // add, 'foo', undefined
    o.foo = 2; // update, 'foo', 1
    delete o.foo; // delete, 'foo', 2
    

    其它

    (1)对象属性模型的相关方法

    Object.getOwnPropertyDescriptor():获取某个属性的attributes对象。
    Object.defineProperty():通过attributes对象。定义某个属性。

    Object.defineProperties():通过attributes对象,定义多个属性。

    Object.getOwnPropertyNames():返回直接定义在某个对象上面的全部属性的名称。

    (2)控制对象状态的方法

    Object.preventExtensions():防止对象扩展。
    Object.isExtensible():推断对象是否可扩展。

    Object.seal():禁止对象配置。

    Object.isSealed():推断一个对象是否可配置。 Object.freeze():冻结一个对象。 Object.isFrozen():推断一个对象是否被冻结。

    (3)原型链相关方法

    Object.create():生成一个新对象,并该对象的原型。
    Object.getPrototypeOf():获取对象的Prototype对象。
    

    Object实例对象的方法

    除了Object对象本身的方法,还有不少方法是部署在Object.prototype对象上的,全部Object的实例对象都继承了这些方法。

    Object实例对象的方法,主要有下面六个

    valueOf():返回当前对象相应的值。
    
    toString():返回当前对象相应的字符串形式。
    
    toLocalString():返回当前对象相应的本地字符串形式。
    
    hasOwnProperty():推断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。

    isPrototypeOf():推断当前对象是否为还有一个对象的原型。 propertyIsEnumerable():推断某个属性是否可枚举。


    对象的属性模型

    属性的attributes对象。Object.getOwnPropertyDescriptor()

    在JavaScript内部,每一个属性都有一个相应的attributes对象,保存该属性的一些元信息。

    使用Object.getOwnPropertyDescriptor方法,能够读取attributes对象。

    var o = { p: 'a' };
    
    Object.getOwnPropertyDescriptor(o, 'p') 
    // Object { value: "a", 
    //         writable: true, 
    //         enumerable: true, 
    //         configurable: true
    // }
    

    attributes对象包括例如以下元信息

    value:表示该属性的值,默觉得undefined。
    
    writable:表示该属性的值(value)能否够改变。默觉得true。
    
    enumerable: 表示该属性是否可枚举,默觉得true。也就是该属性会出如今for...in和Object.keys()等操作中。
    
    configurable:表示“可配置性”,默觉得true。假设设为false,表示无法删除该属性,也不得改变attributes对象(value属性除外)。也就是configurable属性控制了attributes对象的可写性。
    
    get:表示该属性的取值函数(getter)。默觉得undefined。
    
    set:表示该属性的存值函数(setter),默觉得undefined。
    

    Object.defineProperty(),Object.defineProperties()

    Object.defineProperty方法同意通过定义attributes对象。来定义或改动一个属性,然后返回改动后的对象。它的格式例如以下:

    Object.defineProperty(object, propertyName, attributesObject)
    

    var o = Object.defineProperty({}, "p", {
            value: 123,
            writable: false,
            enumerable: true,
            configurable: false
    });
    

    假设一次性定义或改动多个属性,能够使用Object.defineProperties方法

    var o = Object.defineProperties({}, {
            p1: { value: 123, enumerable: true },
            p2: { value: "abc", enumerable: true },
            p3: { get: function() { return this.p1+this.p2 },
                  enumerable:true,
                  configurable:true
            }
    });
    

    上面代码中的p3属性,定义了取值函数get。

    这时须要注意的是,一旦定义了取值函数get(或存值函数set),就不能将writable设为true,或者同一时候定义value属性。否则会报错。


    控制对象状态

    JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions。其次是seal,最强的freeze。

    Object.preventExtensions

    Object.preventExtensions方法能够使得一个对象无法再加入新的属性

    var o = new Object();
    
    Object.preventExtensions(o);
    
    Object.defineProperty(o, "p", { value: "hello" });
    // TypeError: Cannot define property:p, object is not extensible.
    
    o.p = 1;
    o.p // undefined
    

    能够用delete命令删除它的现有属性

    Object.isExtensible

    Object.isExtensible方法用于检查一个对象是否使用了preventExtensions方法。

    也就是说,该方法能够用来检查能否够为一个对象加入属性

    var o = new Object();
    
    Object.isExtensible(o)
    // true
    
    Object.preventExtensions(o);
    Object.isExtensible(o)
    // false
    

    Object.seal

    Object.seal方法使得一个对象既无法加入新属性,也无法删除旧属性

    var o = { p:"hello" };
    
    Object.seal(o);
    
    delete o.p;
    o.p // "hello"
    
    o.x = 'world';
    o.x // undefined
    

    Object.seal还把现有属性的attributes对象的configurable属性设为false,使得attributes对象不再能改变

    可写性(writable)有点特别。假设writable为false。使用Object.seal方法以后。将无法将其变成true。可是,假设writable为true,依旧能够将其变成false

    至于属性对象的value是否可改变,是由writable决定的

    Object.isSealed

    Object.isSealed方法用于检查一个对象是否使用了Object.seal方法

    Object.freeze

    Object.freeze方法能够使得一个对象无法加入新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量

    var o = {p:"hello"};
    
    Object.freeze(o);
    
    o.p = "world";
    o.p // hello
    
    o.t = "hello";
    o.t // undefined
    

    Object.isFrozen

    Object.isFrozen方法用于检查一个对象是否使用了Object.freeze()方法


    參考

    http://javascript.ruanyifeng.com/grammar/object.html
    http://javascript.ruanyifeng.com/stdlib/object.html


  • 相关阅读:
    强化学习
    训练深度神经网络失败的罪魁祸首是退化
    wod2vec&fasttext&doc2vec#ida2vec
    leetcode动态规划之最长回文子串
    数据增强
    【认证与授权】Spring Security自定义页面
    【认证与授权】Spring Security的授权流程
    【认证与授权】Spring Security系列之认证流程解析
    【认证与授权】Spring Security系列之初体验
    【认证与授权】2、基于session的认证方式
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7121539.html
Copyright © 2011-2022 走看看