zoukankan      html  css  js  c++  java
  • javascript 理解对象--- 属性类型

    ECMA-262 把对象定义为:无序属性的集合,其属性可以包含基本值、对象或者函数;

     

    var Person = {
          name:"wsc",
          age :"25",
          job :"software engineer",
           sayname : function(){
              alert(this.name)
          }
     }
     var person = new Object();
     person.name="wsc";
     person.age = "26";
     person.job = "software engineer";
     person.sayname=function(){
           alert(this.name);
    }

     ECMA-262 第5版中定义对象的两种属性:数据属性和访问属性;(为表示特性是内部值,规范将其放在两对方括号中,如[[Enumerable]]

    1.数据属性:包含一个数据值的位置。在这个位置可以读取和写入值。

      4个描述行为的特性;

        (1).[[Configurable]]   // 默认为true ,作用:可以delete删除属性从而重新定义属性;支持修改属性;支持把属性改成访问属性。
        (2).[[Enumerable]]    // 默认为true,作用:可以使用for-in 循环返回属性;
        (3).[[writable]]         // 默认为true ,作用:可以修改属性值;
        (4).[[Value]]             //默认undefined 作用:包含这个属性的数据值;

      修改属性默认的特性 ,方法是Object.defineProperty(),参数(对象名,属性名,描述符对象),如;  

    var person={};
    Object.defineProperty(person,"name",{
           writable:false,
           value : "wsc" 
    });
    
    alert(person.name) ;//wsc
    person.name = "wscir";//在严格模式下,此操作会抛错
    alert(person.name);//wsc;

       注意:a.一旦将属性定义为不可配置的,就不能再把他变回可配置。此时在调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误;
            b.在调用Object.defineProperty()方法时,如果不指定,coonfigurable、enumerable、writable特性的默认值都是false;
          c.只能在DOM对象上使用此方法,而且只能创建访问器属性,不要再IE8中使用Object.defineProperty()方法;

    2.访问属性:不包含数据值,它包含一对getter和setter函数(都不是必须的),读取访问属性时 调用getter函数,写入访问属性时,调用setter函数。

      4个描述行为的特性;

        (1).[[Configurable]]   // 默认为true ,作用:可以delete删除属性从而重新定义属性;支持修改属性;支持把属性改成访问属性。
        (2).[[Enumerable]]    // 默认为true,作用:可以使用for-in 循环返回属性;
        (3).[[Get]]         // 默认为undefined ,作用:读取属性时调用的函数;
        (4).[[Set]]             //默认undefined 作用:写入属性时调用的函数;

      访问属性不能直接定义 ,必须使用Object.defineProperty()来定义,如;  

    var book={
      _year : 2004,
      edition : 1
    }; Object.defineProperty(book,"year",{   get:function(){
        return this._year;  
      },
      set:function(newValues){
        if(newValues > 2004){
          this._year = newValues;
          this.edition +=newValues - 2004
        }
      } }); book.year = 2005 ; alert(book.edition);//2;

    //兼容浏览器有:IE9+ Firefox4+ Safari5+ Opera12+ 和chrome,不支持Object.defineProperty()方法的浏览器中不能修改[[configuarable]]、[[Enumerable]];
    var book={
      _year : 2004,
      edition : 1
    };
    //定义访问器旧有的方法,由Firefox引入 Safari3 Opera9 和chrome1
    Object._defineGetter_("year",function(){
      return this._year;  
    });
    Object._defineSetter_("year",function(newValues){
      if(newValues > 2004){
        this._year = newValues;
        this.edition +=newValues - 2004
      }
    });

    book.year = 2005 ;
    alert(book.edition);//2;
  • 相关阅读:
    在阿里云上遇见更好的Oracle(三)
    从传统IT快速走向公共云计算
    在阿里云上遇见更好的Oracle(二)
    Oracle 11g 审计跟踪管理
    在阿里云上遇见更好的Oracle(一)
    Elasticsearch中的DocValues
    初识Django —Python API接口编程入门
    为什么mysqld启动报错
    云计算产品的四件套
    说说云计算中的地域和可用区概念
  • 原文地址:https://www.cnblogs.com/wangshichuan/p/5880696.html
Copyright © 2011-2022 走看看