1.ES5的属性特性包括下面六个

configurable: 表示能否通过delete来删除属性从而重新定义属性,能够修改属性的特性,默认为true

enumberable: 表示是否能通过for-in循环返回属性。默认为true
writable: 是否可以修改属性, 默认为true
value: 包含这个属性的数据值。读取属性值时3,从这个属性读,写入属性时,把新值保存到这个位置。默认值为undefine.
getter: 在读取属性时,调用的函数
setter: 在写入属性时调用的函数
特别注意:一旦调用了Object.defineProperty方法之后,那些未定义的特性值除了configurable为false之外,其他都为undefined;
 
2.修改单个属性的特性:
 
必须使用Object.defineProperty()方法。这个方法接受3个参数: 属性所在的对象,属性的名字,和一个描述符对象。其中描述符对象的属性必须是:configurable, enumberable, writable,value.设置其中一个或者多个值,可以修改对应的特性值。
修改writable特性,设置为false从而使得属性值不可修改,如下所示:
  1. var person = {};
  2. Object.defineProperty(person, "name", {
  3.   writable: false,//设置属性的特性为不可修改的
  4.   value: "Tom"  //把name属性值设为Tom
  5. });
  6. person.name = "Jany"; //试图把name属性值设置为Jany,但是失败了.非严格模式下会忽略此语句,严格模式则会报错的
  7. console.log(person.name); //结果仍然为Tom
第2到第6行我们设置了name属性的值为Tom,并且把它的writable特性设置为false,然后,我们试图在地7行把它改Jany,但是,最终打印出来的结果仍然是zzy。
修改configurabel特性,设置为false使得属性无法被delete(删除),如下所示:
  1. var person = {};
  2. Object.defineProperty(person, "name", {
  3.   configurable: false, //把configurable设置为false
  4.   value: "Tom"
  5. });
  6. console.log(person.name); //打印结果为Tom
  7. delete person.name; //试图删除name属性
  8. console.log(person.name); //但是name仍然存在,打印出Tom
如果我们把configurable属性值改为true,则属性可以被delete
  1. var person = {};
  2. Object.defineProperty(person, "name", {
  3.   configurable: true,
  4.   value: "Tom"
  5. });
  6. console.log(person.name); //打印出Tom
  7. delete person.name; //试图删除name属性
  8. console.log(person.name); //删除成功,打印出udefined
另外,一旦,我们我们把某个属性的特性设置成了不可配置的,就再也不能把它变回可配置的了。此时,调用Object.defineProperty()方法修改除了writable之外的特性都会报错。
如下:
  1. var person = {};
    //把person.name属性的configurable设置为false;
  2. Object.defineProperty(person, "name", {
  3.   configurable: false,
  4.   value: "Tome"
  5. });
  6. //然后试图重新把person.name属性的configurable设置为true;但是浏览器出现报错信息。
  7. Object.defineProperty(person, "name", {
  8.   configurable: true,
  9.   value: "lyl"
  10. });
  11.  
  12. console.log(person.name);
 我们在浏览器会看到如下的报错信息:
aaarticlea/png;base64,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" alt="" />
 
修改getter和setter特性
  1. //定义一个对象book
  2. var book = {
  3.   _year: 2004, //出版年份
  4.   edition: 1  //版本号
  5. };

  6. //定义year属性的特性
  7. Object.defineProperty(book, "year", {
      //重写get方法,即如果我们试图book.year获取year值时,实质上是获取book._year的值
  8.   get: function() {
  9.     return this._year;
  10.   },
      //重写了set方法,每当对book.year进行赋值时,则相应的修改book._year和book.edition的值
  11.   set: function(newValue) {
  12.     if(newValue > 2004) {
  13.       this._year = newValue;
  14.       this.edition += newValue - 2004;
  15.     }
  16.   }
  17.  
  18. });
  19.  
  20. book.year = 2005;
  21. console.log(book.edition); //
3.同时定义(修改)多个属性的特性
 
由于定义多个属性的可能性很大,因此ES5有定义一个Object.defineProperties方法。利用这个方法可以通过描述符一次定义多个属性。这个方法接受两个对象的参数;第一个对象是要添加和修改器属性的对象,第二个对象的属性与第一个对象中要添加或者修改的顺序一一对应。
  1. var book = {};
  2. Object.defineProperties(book, {
      // 定义一个新的属性_year,并且他的值为2004
  3.   _year: {
  4.     value: 2004
  5.   },
      // 定义一个新的属性edition,并且他的默认值是1,而且属性值是可修改的
  6.   edition: {
  7.     value: 1,
  8.     writable: true// 可修改的
  9.   },
      // 定义一个新的属性year,并且重写了他的get和set方法
  10.   year: {
  11.     get: function() {
  12.       return this._year;
  13.     },
  14.     set: function(newValue){
  15.       if(newValue > 2004) {
  16.         //alert("ok");
  17.         this._year = newValue;
  18.         this.edition += newValue-2004;
  19.       }
  20.     }
  21.   }
  22. });
  23.  
  24. book.year = 2006;
  25. console.log(book.edition);//
 
4.读取属性的特性
 
读取属性的特性,使用Object.getOwnPropertyDescriptor方法
  1. var book = {};
    // 为该对象定义一些属性
  2. Object.defineProperties(book, {
  3.   _year: {
  4.     value: 2004
  5.   },
  6.   edition: {
  7.     value: 1,
  8.     writable: true// 可修改的
  9.   },
  10.   year: {
  11.     get: function() {
  12.       return this._year;
  13.     },
  14.     set: function(newValue){
  15.       if(newValue > 2004) {
  16.         //alert("ok");
  17.         this._year = newValue;
  18.         this.edition += newValue-2004;
  19.       }
  20.     }
  21.   }
  22. });
  23.  
  24. //获取_year属性的特性
  25. var descriptor1 = Object.getOwnPropertyDescriptor(book, "_year");
  26. console.log(descriptor1.configurable); //false
  27. console.log(descriptor1.enumberable); //undefinded
  28. console.log(descriptor1.writable); //false
  29. console.log(descriptor1.value); //
  30. console.log(descriptor1.get); //undefined
  31. console.log(descriptor1.set); //undefined
  32.  
  33. console.log("\n");
  34.  
  35. //获取year属性的特性
  36. var descriptor2 = Object.getOwnPropertyDescriptor(book, "year");
  37. console.log(descriptor2.configurable); //false
  38. console.log(descriptor2.enumberable); //undefined
  39. console.log(descriptor2.writable); //undefined
  40. console.log(descriptor2.value); //undefined
  41. console.log(descriptor2.get); //function()
  42. console.log(descriptor2.set); //function(value)

javascript中对象的属性的特性的更多相关文章

  1. JavaScript中对象的属性

    在JavaScript中,属性决定了一个对象的状态,本文详细的研究了它们是如何工作的. 属性类型 JavaScript中有三种不同类型的属性:命名数据属性(named data properties) ...

  2. JavaScript中对象的属性类型

    JavaScript中,对象的属性有两种:数据属性和访问器属性. 数据属性 特性: 数据属性包括一个数据值的位置.在这个位置可以读取和写入值.数据属性有4个特性. [[configurable]]:可 ...

  3. JavaScript中对象的属性:如何遍历属性

    for/in 语句循环遍历对象的属性. js中获取key得到某对象中相对应的value的方法:obj.key js中根据动态key得到某对象中相对应的value的方法有二: 一.var key = & ...

  4. 记录,javascript中对象的属性名是字符串,却可以不用引号

    问题描述:今日看书,里面介绍js的对象的属性名是包括空字符串在内的所以字符串 问题来了,我们平时定义的对象如下,是没有引号""or’'的 var someone  = {    f ...

  5. 关于JavaScript中对象的继承实现的学习总结

    一.原型链 JavaScript 中原型链是实现继承的主要方法.其主要的思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.实现原型链有一种基本模式,其代码如下. function Super ...

  6. Javascript中对象的Obeject.defineProperty()方法-------------(ES5/个人理解)

    在讲到Obeject.defineProperty()方法之前先得说明一下ECMAScript中有两种属性:数据属性和访问器属性. 两种属性存在的意义:描述对象属性(key)的一些特性,因为这些属性是 ...

  7. javascript中对象字面量的理解

    javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...

  8. javascript中对象的深度克隆

    记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...

  9. javascript中常用坐标属性offset、scroll、client

    原文:javascript中常用坐标属性offset.scroll.client 今天在学习js的时候觉得这个问题比较容易搞混,所以自己画了一个简单的图,并且用js控制台里面输出测试了下,便于理解. ...

随机推荐

  1. WebSphere数据源配置

    WebSphere data source Configuration login http://localhost:9061/ibm/console/login.do(According to yo ...

  2. C++ Tempatet之模板模型

    模板一共有三种类型: 1.第一种包含模型:包含模型是讲模板的定义和声明都放在头文件里(注:一般我们写的代码是将声明放在头文件里,实现放在cpp里,防止产生两份实现代码) 缺点:包含模型会增加代码的量. ...

  3. SQLSERVER中WITH(NOLOCK)详解

    在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST .有关 NOLOCK 和 READPAST的一些技术知识 ...

  4. 动态调用WCF服务

    动态调用WCF服务,只需要提供*.svc地址, 1:命名空间: using System.ServiceModel.Channels;using System.ServiceModel; 2:创建访问 ...

  5. ASP.NET MVC中几个运用技巧

    1. Razor Helpers 的运用:例如,定义好 ViewBag.Message = "Welcome to ASP.NET MVC!";我要在界面上显示"Welc ...

  6. associated 2 maps

    <!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" content= ...

  7. c3p0 --1

    # # This file is detritus from various testing attempts  # the values below may change, and often do ...

  8. Sqli-labs less 41

    Less-41 此处与less-39是一致的,区别在于41错误不回显.所以我们称之为盲注. Payload: http://192.168.11.189/sqli-labs/Less-41/index ...

  9. Sqli-labs less 42

    Less-42 Update更新数据后,经过mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化.在select调用的时候才能发挥作用.所以不用考虑在更新密 ...

  10. iOS第三方解决键盘遮挡-IQKeyboardManager

    百度云:http://pan.baidu.com/s/1yg5ae githun:https://github.com/hackiftekhar/IQKeyboardManager AppDelega ...