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从而使得属性值不可修改,如下所示:
var person = {};
Object.defineProperty(person, "name", {
  writable: false,//设置属性的特性为不可修改的
  value: "Tom"  //把name属性值设为Tom
});
person.name = "Jany"; //试图把name属性值设置为Jany,但是失败了.非严格模式下会忽略此语句,严格模式则会报错的
console.log(person.name); //结果仍然为Tom
第2到第6行我们设置了name属性的值为Tom,并且把它的writable特性设置为false,然后,我们试图在地7行把它改Jany,但是,最终打印出来的结果仍然是zzy。
修改configurabel特性,设置为false使得属性无法被delete(删除),如下所示:
var person = {};
Object.defineProperty(person, "name", {
  configurable: false, //把configurable设置为false
  value: "Tom"
});
console.log(person.name); //打印结果为Tom
delete person.name; //试图删除name属性
console.log(person.name); //但是name仍然存在,打印出Tom
如果我们把configurable属性值改为true,则属性可以被delete
 var person = {};
Object.defineProperty(person, "name", {
  configurable: true,
  value: "Tom"
});
console.log(person.name); //打印出Tom
delete person.name; //试图删除name属性
console.log(person.name); //删除成功,打印出udefined
另外,一旦,我们我们把某个属性的特性设置成了不可配置的,就再也不能把它变回可配置的了。此时,调用Object.defineProperty()方法修改除了writable之外的特性都会报错。
如下:
var person = {};
//把person.name属性的configurable设置为false;
Object.defineProperty(person, "name", {
  configurable: false,
  value: "Tome"
});
//然后试图重新把person.name属性的configurable设置为true;但是浏览器出现报错信息。
Object.defineProperty(person, "name", {
  configurable: true,
  value: "lyl"
}); console.log(person.name);
 我们在浏览器会看到如下的报错信息:
aaarticlea/png;base64,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" alt="" />
 
修改getter和setter特性
 //定义一个对象book
var book = {
  _year: 2004, //出版年份
  edition: 1  //版本号
};

//定义year属性的特性
Object.defineProperty(book, "year", {
  //重写get方法,即如果我们试图book.year获取year值时,实质上是获取book._year的值
  get: function() {
    return this._year;
  },
  //重写了set方法,每当对book.year进行赋值时,则相应的修改book._year和book.edition的值
  set: function(newValue) {
    if(newValue > 2004) {
      this._year = newValue;
      this.edition += newValue - 2004;
    }
  } }); book.year = 2005;
console.log(book.edition); //
3.同时定义(修改)多个属性的特性
 
由于定义多个属性的可能性很大,因此ES5有定义一个Object.defineProperties方法。利用这个方法可以通过描述符一次定义多个属性。这个方法接受两个对象的参数;第一个对象是要添加和修改器属性的对象,第二个对象的属性与第一个对象中要添加或者修改的顺序一一对应。
var book = {};
Object.defineProperties(book, {
  // 定义一个新的属性_year,并且他的值为2004
  _year: {
    value: 2004
  },
  // 定义一个新的属性edition,并且他的默认值是1,而且属性值是可修改的
  edition: {
    value: 1,
    writable: true// 可修改的
  },
  // 定义一个新的属性year,并且重写了他的get和set方法
  year: {
    get: function() {
      return this._year;
    },
    set: function(newValue){
      if(newValue > 2004) {
        //alert("ok");
        this._year = newValue;
        this.edition += newValue-2004;
      }
    }
  }
}); book.year = 2006;
console.log(book.edition);//
 
4.读取属性的特性
 
读取属性的特性,使用Object.getOwnPropertyDescriptor方法
var book = {};
// 为该对象定义一些属性
Object.defineProperties(book, {
  _year: {
    value: 2004
  },
  edition: {
    value: 1,
    writable: true// 可修改的
  },
  year: {
    get: function() {
      return this._year;
    },
    set: function(newValue){
      if(newValue > 2004) {
        //alert("ok");
        this._year = newValue;
        this.edition += newValue-2004;
      }
    }
  }
}); //获取_year属性的特性
var descriptor1 = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor1.configurable); //false
console.log(descriptor1.enumberable); //undefinded
console.log(descriptor1.writable); //false
console.log(descriptor1.value); //
console.log(descriptor1.get); //undefined
console.log(descriptor1.set); //undefined console.log("\n"); //获取year属性的特性
var descriptor2 = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor2.configurable); //false
console.log(descriptor2.enumberable); //undefined
console.log(descriptor2.writable); //undefined
console.log(descriptor2.value); //undefined
console.log(descriptor2.get); //function()
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. 搬瓦工VPS搭建PPTP VPN

    之前一直在用神器Lantern和Nydus(20元一个月),感觉还不错,但是各有各的不足! 于是开始自己动手折腾用VPS搭建VPN... 上网逛了一圈,最后选择了搬瓦工的VPS:512RAM,10G ...

  2. Nagios全方位告警接入-电话/微信/短信都支持

    百度告警平台地址: http://gaojing.baidu.com 联系我们: 邮箱:gaojing@baidu.com 电话:13924600771 QQ群:183806029 Nagios接入 ...

  3. 【数据结构】通用的最小堆(最大堆)D-ary Heap

    听说有一种最小(大)堆,不限于是完全二叉树,而是完全D叉树,名为D-ary Heap(http://en.wikipedia.org/wiki/D-ary_heap).D可以是1,2,3,4,100, ...

  4. matrix_last_acm_4

    2013 ACM-ICPC吉林通化全国邀请赛 A http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97654#problem/A 题意:输入 ...

  5. Windows键盘快捷键

  6. [工作积累] error: bad class file magic (cafebabe) or version (0033.0000)

    Update Android SDK build tool to latest can solve my problem.

  7. 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复

    由于工作很忙, 近半年的业余时间没空搞了, 不过工作马上忙完了, 趁十一有时间修了一些小问题. 这次更新跟骨骼动画无关, 修复了一个之前的, 关于tangent space裂缝的问题: 引擎设计跟踪( ...

  8. Codeforces Round #271 (Div. 2) F ,E, D, C, B, A

    前言:最近被线段树+简单递推DP虐的体无完肤!真是弱! A:简单题,照着模拟就可以,题目还特意说不用处理边界 B:二分查找即可,用lower_lound()函数很好用 #include<stri ...

  9. CSS3:线上编辑工具及实用资料整理

    an I Use 个人最常用的,资料比较全,桌面和移动浏览器支持HTML5,CSS3,SVG和兼容性表. 官网地址:http://caniuse.com/ CSS3 Click Chart CSS3 ...

  10. HDOJ 1428 漫步校园

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...