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,iVBORw0KGgoAAAANSUhEUgAAAuUAAAA3CAIAAAAkMaOkAAAOkElEQVR4nO2dPWwbRxbHp0sX6JpUKeziCoMFiZyNAwwITiohgIEDUuzhwGMVKWWqnHBCAOLAJtzWCNKwOGGLsAgIs0yKXHKgAEcSYgNeyZYgAYYc+y4wi0iyaZsnk3PFzM7O135R/FhJ/8UPxmq5O/Pe7FjvzzdvV+Tw8JB2uwAAAAAAueK/RycCEqVXjjc391dW/IWFnfn5h1ev+gsL+ysrRxsbM7ceAAAAABeBZL3ydHV1+/r1Q0LeEEIJoYS8IeSQkO3r159+883MHQAAAADAuSdBrzxdXb33zjtCqci8IeTuW289XV2duQ8zYL1GSXkMjZRqkZ82y3yom7N2Nj3jtdkcn/gRyxW1Ei03aZnQ2vqZaRkAAHJMnF452tjYvn79DSG02aTff09LJR6N5ufpt9/S27ffELJ95crx5mZE6+u0ZAid0X7JrtfUdkp0faYDJwLnaSJo3LVN7uMZitBjtzmfeiWlDc0yLTdprTR+uTm5lgEAIMfE6ZX9lZVDpg++/JJSSn/5hV66ROfmaKdDKaVff00JOSRkf2UloZvTh5k8BCqF5mT1yljyN1Nm7Dafdb1SW5+UXplQywCcLTonRUKJ06fdnlugpHCyNYH2i9XeKRrpuQVKyKCd1EvFC370BoQM3c74vPAGpHCyxS2RcPrpWuhX5EHQrM02DhLBzWo7GW5cnF7xFxbClaAff6SU0nv36O3blFJ65w6dm6OEDAjxFxYSulF+xa/TklgvaFJSos0aLZXDTEwzuEROpUSFrjKhpKzsK9eW9TP5p2Z6phkOZLNLayVL72XVQuGLljeKNCboVM4VCdGjnNNUbmypZjfAbFk3wHpyOfKcmAFJvtyw2fRUvolsXxsry7CLiaFOgzjf1bmUPDfSzT3egnzHm/pMtub8rEMd42kz6CL+LgNwjvEGRAqKbScq5Pcro+iV1CdH6JVoeyL6sp7MxdagokTxQUWO65qR3kD+LcvHh7VDKLGZulUdKidnRtMZg4qj/Kj51XYiPwqMEce5DGJ6pV0dplFpcXrl4dWrShC6c4eyLRArjJ1CIcFnTW2whLbYkQVEs0xJmXab4Td1EdjMEK79Tg8jhxQVePtSSLboFVlCqYQWBic0y4ovViGlGKM6IpsXHinrrWk7FgNsV5kGhCdHj4nmkWVA0l2uG294atUrVrVkToxaSWoh3nd1LiXPjXRzT54/okdtJkdN/pih1jxtlsOdeE8BOL+wKBuE2BQpimx6pV8xpYAVu15JY0/iyVK0JkO3E9jfOSmKH838h02vCEVCCNVDvir7TnMjAonWr4gfzQFUzTPs1+6Role2dDVjJ06v7MzPh53PzfHMCtMrkl2Z9Yr4LVyWvgGHH5VoU6tWKdtlgRb8rPvWaxPMS5EYiL9WMSDaEasUkxMY3aRIr10VNRrxYyL2xZf+crQmi7k8jc0xRxKHXfSb0vcwe5dybqSbe/ol0kxOnF2W/JDqqVWnWj0F4JzQlxIMg7YWgJ0T+ft9GDjZoolnrAcFIZMF6UANiH0ecdXoLqUQtBAb6BWeNjBWVSoes3bodlizQ7cjwrbcuB6G5djcdtT/5VHio2tfKtqqnrTDNq0pin5FjFV8+zZUPaSgKyFvEByxKcKOYkCxeqLpFX3hyUbq9aDbt+nhIe106L17lFL63Xfs+BtC/Bs3Enw2g3qZ0GZTj83driXGRLUwOb0if+eOCrQjGBb1qdW8TLE/xp1MeiVmQEbQK3IuIaWCiR92Wa+k8X1kvZJ+NLSZnP52RHkac98BOOf03AItVnsp9MqwWKA2vTKUIuKgnU6vhPHSzKawI4WhZIBdrxTFQdkGYZiuVyLSJ3LA5okW9QRvQMiw4gxVaRV6ZAv2zIBhxetZesl+g4J+eaLFfqYtL6WNc8XT8yvRwxISW29bq/F621u36NERPTig8/P00iX68CGllN66RVm97SefJPgZlcBgNR9agl1bSohpwR5xbTn/KDnCUZc/5POVZQibJetGkWmUMeERdY3Dck4KvWK9KnJkYsfEEhRTrAcl6hXZ0zBOB2MVP7Dmp0q/6Xxncyn93Eg597Q7Ls/kxMlv3k3NU8sYnqkH2gHIjFoh4fRp7HoQy0YopRuGLBAyxaZXuuq3/75SPqKlWML2uUnFak/rSzKVKwO3I3dh1SuKYsiYX5FTFD2qu2DpyMgbZdMrGfIr8qDpq0X9Chm0OydFMnB5bsnUK8m1t3F65Xhz88GVK29YcuX+fVoO3q5x8yZdX6c//MCeZ05+0a09ItrqT+XVenHQkhiP/t6sXGvmb6x6Re2u2Q2rI8tGzLPmiohRb2ttmR0XLykpS5Uf2jnJesV2lWmA5WRjTKISPPKApLnc3BGeCgu1JSczV6F9GjMsUb5rcylxbqSZe3F3XJrJiZNf7EdNMOuO1VMAzgXSKkb49TpJrwRROeL5IJtekRsx9ErUd3o5T+ANovVKjCRK1Ct60iKVkpAdrwbGhxZ2wyOsgPcUeiVL/oNLz+i8S891hNIat16h3e7T1dW7b789/vfFmYsF4/5vAHJETDnqeMk6l04/9yzVygCAtIQx3khmEFmLKOtBEXpFDlBhCSfPVRQ1vcITGHJShBOqpTi9wu0ZWa/IGiUqgaGJAy3VISV1YnIepsiI0ivW48bAGoOs3spI48PWzKtG0yurNvHxdHV1+733zPfxP7h8+T9ffTXiNC1HrL+A84TIIkytUHT6eiWm0hYAkIgow2SVHyzIiYOqfEnQK/yxWFl/cDUQ1MxqJa7S2k2oYBL1imLPSHpFD8zBYtNJRN5FOY0EHlHFF+WghNFO1EtlYt77wtahWC1R0JSpLZL0SuJQZKy3pZRaTzra2NhfWvJv3NgpFHYKBf/GDfy9QwAAAGAUgreuSWUx3SBgnwj9dJpHkQP0VTZCLKKBMt0Q9QQ1P86aCiugMxXtmi+tEfpGUoFZnmeO0isAAAAAGBdqjc6FJ92rYqBXAAAAAJB3oFcAAAAAkHegVwAAAACQd6BXAAAAAJB3pqdXTp48ebW393Jnp/fgwau9vf89fjxz5wEAAABwJpiGXhk+e/Z6b6/n+4IXvv/c93s7O8Nnz2Y+BBeXllNpzdqGEK+y6LRbDql742pzq1EoNjx3ueCuZbuKLFfT/aFXAAAAU2IaeoWJlZe+/8r3X/n+S1my7O6mamStWlx0rE9mt+uk2OiM0+CWQyL6ot0u7XqVRUIWRQjsuMskT1E/PV5lfMrg9Gw1CpVWx12OGfnsDi5Xt1pO1unRbkCsAABA7pi4Xjl5/FiIlde+/zqQLEyvHPt+1MJQu07IIhHSYatRHUMkW/PaKb5qx/S11XDctS7NHgVpl6ku5hSZ7Df4FG6OZzzHhuc2OrRVzZQISeFgx21k1WQdtw69AgAAuWPieuXV3l4vECt9m155ubdnuVCsCwQ7Y4mvXG0knxajV05lRmjAaIpnbG7mK7mSJ6BXAAAgj0xcr/QePIjPrxxvb5tXbTUKwSILXyPYalTdRkHLTLAcTHAmW6khogBii53P12467nJSboPnPwqVerWdqgV2JFjCWKsWFx3NSLUFXa+wTystZrnT7ko5mLpH+WpXlfllddNoQTcyOIGNVbCMtVatBGopexfSCYHvQTKs4K7ZxyEbthaULloOWS4UF0mx7hQX+YKgNtSjMkJKBgAAwMSZhl554ftR9StReqVdlwtEmF4piLCk1IsERaPtulg5cnjUZMJFis3xiYeg06CKIrwwzEaY+RX5iDCSG2O0EMRUKZAr5TJhAUfgplfhn/Lv/bqbegs2N1teu6suEkljMkoX2sJNmCvyKoFIUsYhO5EjyW8364j/6zY61ps1Au36Ga1GAgCAc87k14P2918EjwW9VJ8POvb9o4iSW2t+hUc+7akW/qOUV2B5AtvDL7F6JVwI4H21HNGglC+J1ysiMWNvwWKAYqcUa3kA9twwEaKmT0Q6xPDU6MVrt7QyUjmoj9BFcA4XYWF3TF7o45Ado4XQKq5X6p741210rDdrJLAeBAAAeWTy9bZPnjz3/ee+/0KCZ1Z8/8j3Xz96ZLlQZEfC+hWuYBLzKzyRIFqQMvxB6sVajipyG2Z+pdtupcyvqFHWaCFJr9jyKzz68h3dTb0Fu5vtRsFVz5EyH6N0ERhfVauPRX5lzHrFuPuGXrHdrJGAXgEAgDwyjeeZe7u7x77/XOJYSq5EvYIlWDoJ4nfLc+tKeUpwmlAAQVGFteKBnc++hbMTzOeWw/qVAlGXbwJJxL/BB+FZ/dLPLq974Y7Wgty7YqHklFq/QrueW3eKiheKm5YWutaOzHUZkWLJ3IW5qmXUr6jjEP04uh17C4TwgpWC23D4beJlLnzFUMkJWdpMYwP0CgAA5JEpvS+OSZZjSakwsTL49dcRm9Xj+vlELSgefaAisiNOUIc78aKNPDw+ndIGvC8OAAByyPTex98/OOjt7h5vbx9vb/d2d/sHB3i57YVgrVpcHPc7/c6iDQAAAE4B/t4hAAAAAPJO3vXKvzd/uPy3mz9u/GvmlgAAAABgVuRar9z5ufOHf/yFLF37/d//dOdnJPMBAACAC0p+9crd+z/9sfZXsnSNUar++e79n2ZuFQAAAACmT371ypXPP3r3sw8vL9/83acfXF6++e5nH175/KOZWwUAAACA6ZNfvXKwt80gS9fE/sytAgAAAMD0ya9eEZClazO3AQAAAAAzJO965bfHj6BXAAAAgAtOrvXKb48f/fO75vtffDxzSwAAAAAwQ/KrV8jStblPP3j/i48foWwFAAAAuNjkV68AAAAAADCgVwAAAACQd6BXAAAAAJB3oFcAAAAAkHegVwAAAACQd6BXAAAAAJB3oFcAAAAAkHegVwAAAACQd6BXAAAAAJB3oFcAAAAAkHd0vfIQGzZs2LBhm9g287AHzhDyzDHyK9iwYcOGDdvktlmHQHCWkDboFWzYsGHDhg1b3jdZr/wfoOMSwczUiRMAAAAASUVORK5CYII=" 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. Grails 1.2参考文档速读(10):Controller

    转载:http://keyvalue.blog.51cto.com/1475446/303260       从本篇起,我们将开始进入Grails的Web层,首先让我们从Controller说起. G ...

  2. Chapter 3 Discovering Classes and Object

    Chatper 3 Discovering Classes and Object Exercises: 1.What is a class? A class is a template for man ...

  3. 【Python】内置数据类型

    参考资料: http://sebug.net/paper/books/dive-into-python3/native-datatypes.html http://blog.csdn.net/hazi ...

  4. thinkphp中SQLSTATE[42S02]: Base table or view not found: 1146 Table错误解决方法

    随手记录下今天在thinkphp3.2.3中遇到的错误SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.file_info ...

  5. css hack一览

    浏览器对css hack的支持情况

  6. close和shutdown的区别

    转的,没验证 close(sock_fd)会把sock_fd的内部计数器减1当sock_fd的内部计数器为0时, 才调用shutodwn(), 并最终释放文件描述符调用shutdown()只是进行了T ...

  7. 请教DotNetBar控件中的CalendarView控件如何拖动当前的时间轴

    本人想拖动那个当前的时间轴或者让时间轴变动,因为那个时间轴默认的是当前时间.(就是那个黄色的线)

  8. 十大技巧优化Android App性能

    无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的. 那么,如何能开发出更高性能的Android App?相信是软 ...

  9. android 启动adb

    1.命令行进入 sdk/platform-tools 2.执行命令 adb kill-server 3.执行命令 adb start-server

  10. Cpp多重继承会产生的问题

    多重继承常常被认为是 OOP 中一种复杂且不必要的部分.多重继承面临 crash 的场景并非难以想象,来看下面的例子. 1. 名称冲突 来看以下情况: 如果 Dog 类以及 Bird 类都有一个名为 ...