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. 文件和文件夹同步工具AFiles 1.0 发布

    文件和文件夹同步工具AFiles 1.0  正式发布了! 本软件支持按文件日期或长度的各种比较方式来同步文件或者文件夹. 支持双向同步功能. 支持深层文件夹功能. 可以自动产生比较和同步的记录情况. ...

  2. Codeforces Round #277.5 (Div. 2)

    题目链接:http://codeforces.com/contest/489 A:SwapSort In this problem your goal is to sort an array cons ...

  3. ZOJ 1111 Poker Hands

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1111 A poker hand consists of 5 ca ...

  4. 【BZOJ】【3210】花神的浇花集会

    曼哈顿距离与切比雪夫距离 QAQ蒟蒻并不知道切比雪夫距离是什么……并不会做这道题…… 去膜拜了PoPoQQQ大爷的题解: 题目大意:给定平面上的n个点,求一个点到这n个点的切比雪夫距离之和最小 与31 ...

  5. HackPorts – Mac OS X 渗透测试框架与工具

    HackPorts是一个OS X 下的一个渗透框架. HackPorts是一个“超级工程”,充分利用现有的代码移植工作,安全专业人员现在可以使用数以百计的渗透工具在Mac系统中,而不需要虚拟机. 工具 ...

  6. sao/jsp

    sao/i18n/message/ Messages-Client.xml   Messages-Server.xml   sao/wsdl Verification.wsdl   IProcessS ...

  7. 深入理解jQuery的Event机制

    jQuery的Event模块非常强大.其功能远远比原生事件监听器强大许多,对同一个元素的监听只用一个eventListener,内部则是一个强大的观察者,根据匹配事件类型触发相应回调.jQuery不仅 ...

  8. Appstore提交 被拒绝

    Reasons 16.1: Apps that present excessively objectionable or crude content will be rejected 16.1 We ...

  9. POJ 1607

    #include<iostream> #include<iomanip> using namespace std; int main() { //freopen("a ...

  10. ARM系列产品

    ARM7系列 ARM9系列 ARM9E系列 ARM10E系列 SecurCore系列 Intel的StrongARM ARM11系列 Intel的Xscale 其中,ARM7.ARM9.ARM9E和A ...