• (译)ECMAScript 5 Objects and Properties (一)


       @by: Aaron

        有一些新的API包含在规范中,但是更多有趣的功能发挥作用是 对象/属性 代码,如何使用能作用你的对象,通过私有的"getters" 和 "settses",阻止枚举,操作,或者删除,甚至防止添加新属性.简而言之:你将能够复制和扩展现有的基于JavaScript的api(如DOM)只使用JavaScript本身。

      也许最重要的是,尽管:这些特性将到达在所有主要的浏览器。所有主要的浏览器厂商从事规范并同意实施在他们各自的引擎。但是确切的时间表还不清楚,但这将是早,而非更晚。

      ES5在这一点上似乎还没有存在的完整实现,但是有一些作品。在此期间你可以阅读ECMAScript 5规范

    Objects

     一个ECMAScript 5新特点是扩展性对象能够被切换。关闭可扩展性可以防止新的属性添加到一个对象上

    Object.preventExtensions( obj )
    Object.isExtensible( obj )

    preventExtensions锁定了一个对象,阻止和将来的属性发生冲突

    isExtensible是一个方法来确定当前对象的可扩展性。

    示例用法:

    var obj = {};
     
    obj.name = "John";
    print( obj.name );
    // John
     
    print( Object.isExtensible( obj ) );
    // true
     
    Object.preventExtensions( obj );
     
    obj.url = "http://ejohn.org/"; // Exception in strict mode
     
    print( Object.isExtensible( obj ) );
    // false

    属性和描述符:

      属性已经被彻底颠覆。不再是简单的值关联的对象——你现在拥有完全控制如何表现。用这能力,虽然,是增加了复杂性。  

      对象属性分为两个部分.

      对于实际的“meat”的一个属性有两种可能性:一个值(,我们ECMAScript 3知道,一个“数据”属性—这是传统的值)或一个Getter和Setter(从一些现代浏览器我们知道,一个“访问”属性,就像Gecko和WebKit)。

    • Value 包含该属性的值.
    • Get 函数调用时该属性的值被访问。
    • Set 调用函数,该属性的值是变化的。

    另外,属性可以被…

    • Writable. 假如是false,这个属性的值不能被改变.
    • Configurable. 假如是flase,任何试图去删除这个属性或者改变它的特性(Writable, Configurable, or Enumerable)都将失败.
    • Enumerable. 假如是true,当用for (var prop in obj){}(用着其他相似功能),这个属性可以被遍历出来

    这些不同的属性完全弥补属性描述符。例如,一个简单的描述符可能类似于以下:

    {
      value: "test",
      writable: true,
      enumerable: true,
      configurable: true
    }

    这三个属性(writable, enumerable, and configurable)都是可选的,所有默认为true

    你能够用new Object.getOwnPropertyDescriptor 的方法得到它的信息

    Object.getOwnPropertyDescriptor( obj, prop )

    这种方法允许您访问描述符的属性。这个方法是唯一的方式来获得这些信息(否则,不提供给用户——这些不存在可见的属性的属性,它们存储在内部的ECMAScript引擎)。

    示例使用:

    var obj = { foo: "test" };
     
    print(JSON.stringify(
      Object.getOwnPropertyDescriptor( obj, "foo" )
    ));
    // {"value": "test", "writable": true,
    //  "enumerable": true, "configurable": true}

    Object.defineProperty( obj, prop, desc )

    这个方法允许你在一个对象上(或者改变这个存在的属性)定义个新的属性.这个方法接受一个属性描述符用来初始化(更新)属性

    示例使用:

    var obj = {};
     
    Object.defineProperty( obj, "value", {
      value: true,
      writable: false,
      enumerable: true,
      configurable: true
    });
     
    (function(){
      var name = "John";
     
      Object.defineProperty( obj, "name", {
        get: function(){ return name; },
        set: function(value){ name = value; }
      });
    })();
     
    print( obj.value )
    // true
     
    print( obj.name );
    // John
     
    obj.name = "Ted";
    print( obj.name );
    // Ted
     
    for ( var prop in obj ) {
      print( prop );
    }
    // value
    // name
     
    obj.value = false; // Exception if in strict mode
     
    Object.defineProperty( obj, "value", {
      writable: true,
      configurable: false
    });
     
    obj.value = false;
    print( obj.value );
    // false
     
    delete obj.value; // Exception

    Object.defineProperty 在新的ECMAScript版本中是一个核心的方法.几乎所有其他主要功能的的实现都依赖这个方法上

    Object.defineProperties( obj, props )

    意思是同时定义个一些属性(而不是单独的一个)

    Object.defineProperties = function( obj, props ) {
      for ( var prop in props ) {
        Object.defineProperty( obj, prop, props[prop] );
      }
    };
    var obj = {};
     
    Object.defineProperties(obj, {
      "value": {
        value: true,
        writable: false
      },
      "name": {
        value: "John",
        writable: false
      }
    });

    ECMAScript5的新功能中,属性描述符(及其相关方法)可能是最重要的.它使开发人员能够有细粒度的控制他们的对象,防止不受欢迎的修修补补,和维护一个统一的网络兼容的API。

     

  • 相关阅读:
    Unix & Linux 教程学习_2
    Unix & Linux 教程学习
    再次测试一下markdown
    黑马程序员-OC练习作业
    黑马程序员-根据本地地址计算文本中有多少行的代码
    黑马程序员-OC常见结构体NSRange、NSPoint、NSSize、NSRect
    黑马程序员-OC内存管理的初步认识
    黑马程序员-OC的构造方法init以及自定义构造方法
    黑马程序员-OC的三大特性:封装、继承、多态
    黑马程序员-OC的类和对象的初步认识
  • 原文地址:https://www.cnblogs.com/aaronjs/p/3138508.html
Copyright © 2020-2023  润新知