添加属性到对象,或修改现有属性的特性
 
用法:
    Object.defineProperty(object, propertyName, descriptor);
参数:
    object : 作用的对象,可以是javascript对象,或dom对象。
    propertyName : 属性名,字符串。
    descriptor : 属性的特性描述,区分数据属性或访问器属性。
返回值:
    修改后的对象。
异常:
   1. object不是对象。
    2. object不可扩展。
    3. descriptor有value或writable特性,同时有get和set特性。
    4. descriptor的get和set特性不是函数。
    5. 对象的属性名已存在,同时descriptor的configurable特性为false,且descriptor包含一个以上与现有属性的特性不同的特性。但configurable为false,且writable为true时,允许value或writable特性不同。
 
defineProperties和defineProperty差不多,就不介绍了。
 
例子:
'use strict';
(function(){
if(!Object.defineProperty){
console.log('浏览器不支持defineProperty');
return;
} var person = {}; //向person添加name属性和它的访问器
Object.defineProperty(person, 'name', {
set : function(n){
console.log('set 访问器');
this.nameValue = n; //一个新的属性,如果同样是name的话,就死循环了。
},
get : function(){
console.log('get 访问器');
return 'my name is ' + this.nameValue;
},
//value : 'jeck', //如果在这里有value或writable特性,就会报错:Uncaught TypeError: Invalid property. A property cannot both have accessors and be writable or have a value。
enumerable: true,
configurable: true
});
person.name = "haha"; //触发set访问器
console.log(person.name); //触发get访问器 output: my name is haha
console.log(person.nameValue); //output: haha //向person添加id数据属性。
Object.defineProperty(person, 'id', {
value : '1234567890',
writable : false,
enumerable : false,
configurable : false
});
console.log(person.id); //output: 1234567890
//person.id = '0987654321'; //报错,因为id是只读的,不可写。 //列出对象的属性
var propertyNames = Object.getOwnPropertyNames(person);
for(var i = 0, len = propertyNames.length; i < len; i++){
var name = propertyNames[i]
console.log(name + ': ' + person[name]);
}
/*output:
name: my name is haha
nameValue: haha
id: 1234567890*/ //列出某一属性的所有特性。
var descriptor = Object.getOwnPropertyDescriptor(person, 'id');
descriptor.writable = true;//这里将原来的writable特性改为了true。
for(var prop in descriptor){
console.log(prop + ': ' + descriptor[prop]);
}
/*output:
value: 1234567890
writable: true
enumerable: false
configurable: false*/ //defineProperty的复数版:
Object.defineProperties(person, {
sex : {
value : 'boy',
writable : true,
enumerable : false,
configurable : true
},
age : {
set : function(x){
this.ageValue = x;
},
get : function(){
return this.ageValue;
}
}
}); person.sex = 'girl'; //变性成功!
person.age = 23; console.log('sex: ' + person.sex);
console.log('age: ' + person.age);
/*output:
sex: girl
age: 23*/
})();

Object.defineProperty和Object.defineProperties的更多相关文章

  1. 对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法

    1.在某个对象是否拥有某个属性,判断的方法有很多,常用的方法就是object.hasOwnProperty('×××'),这个方法是不包括对象原型链上的方法的,举个例子: var obj = { na ...

  2. Object.defineProperty和Object.freeze、Object.seal

    目录 一 Object.defineProperty 1.1 用法 1.2 数据描述 1.2.1 value 1.2.2 writable 1.2.3 enumerable 1.2.4 configu ...

  3. MVVM双向绑定实现之Object.defineProperty

    随着web应用的发展,直接操作dom的应用已渐行渐远,取而代之的是时下越来越流行的MVVM框架,dom操作几乎绝迹,这里面自然是框架底层封装的结果.MVVM框架的双向数据绑定使开发效率大大提高:然后在 ...

  4. 关于Object.defineProperty 的基础知识

    Object.defineProperty 这个方法大家耳熟能详,可以对 对象的属性进行添加或修改的操作.即可以进行  数据劫持 .vue就是通过这个方法来劫持数据的. 平时我们创建对象的时候,一般通 ...

  5. Object.defineProperty实现数据绑定

    1.Object.defineProperty方法 Object.defineProperty(obj, prop, descriptor); (1)参数:  obj:目标对象 prop:需要定义的属 ...

  6. vue实现双向数据绑定之Object.defineProperty()篇

    前言 vue.js中使用ES5的Object.defineProperty()实现数据的双向绑定 Object.defineProperty()原理 Object.defineProperty()可以 ...

  7. JS属性描述符之Object.defineProperty()定义对象属性特性

    一.Object.defineProperty的作用 用来给对象新增属性,和修改对象中的属性. 二.JS对象中的描述符 js对象中两种属性描述符:数据描述符和存取描述符(访问描述符). 注意事项: 1 ...

  8. Object.defineProperty和proxy

    Object.defineProperty问题 Object.defineProperty() 无法监控到数组下标的变化.vue只能通过以下几种方法来监听 pop() shift() unshift( ...

  9. js中的Object.defineProperty()和defineProperties()详解

    ECMAS-262第5版在定义只有内部采用的特性时,提供了描述了属性特征的几种属性.ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述 ...

随机推荐

  1. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  2. Hadoop命令别名

    [hadoop@master ~]$ alias hdfs='hadoop dfs' [hadoop@master ~]$ hdfs -ls / drwxrwxr-x   - hadoop super ...

  3. postgresql架构基础(转)-(1)

    PostgreSQL使用一种客户端/服务器的模型.一次PostgreSQL会话由下列相关的进程(程序)组成: 一个服务器进程,它管理数据库文件.接受来自客户端应用与数据库的联接并且代表客户端在数据库上 ...

  4. Jenkins之构建执行脚本权限问题

    Jenkins需要执行的脚本不在本机需要ssh免密码登陆到远程主机执行 Jenkins部署机ip地址为192.168.56.12 需要远程执行脚本的主机为192.168.56.11 设置好密钥可以使用 ...

  5. 使用pidstat查看进程资源使用情况

    简介 pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存.设备IO.任务切换.线程等.pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上 ...

  6. OSX: 下载Flash Player的脚本

    http://blog.csdn.net/cneducation/article/details/54742983

  7. mysql db imported into mongodb

    desc cwd_user show columns from cwd_user select COLUMN_NAME from information_schema.columns where ta ...

  8. wireshark, loopback

    swapondd if=/dev/zero of=/data/mnt/swap bs=1024 count=8024000 sudo apt-get install wireshark sudo gr ...

  9. Python开发【Django】:基础

    Django基本配置 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Se ...

  10. Hive与ES整合

    https://www.elastic.co/guide/en/elasticsearch/hadoop/current/hive.html 注:添加的第三方jar必须位于namenode下,否则依然 ...