添加属性到对象,或修改现有属性的特性
 
用法:
    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. MQTT协议笔记之订阅

    前言 记忆不太好的时候,只能翻看以前的文章/笔记重新温习一遍,但找不到MQTT协议有关订阅部分的描述,好不容易从Evernote中找到贴出来,这样整个MQTT协议笔记,就比较齐全了. SUBSCRIB ...

  2. Cloud Foundry技术全貌及核心组件分析

    原文链接:http://www.programmer.com.cn/14472/ 历经一年多的发展,Cloud Foundry的架构设计和实现有了众多改进和优化.为了便于大家了解和深入研究首个开源Pa ...

  3. LeetCode——House Robber

    Description: You are a professional robber planning to rob houses along a street. Each house has a c ...

  4. OLE工具套件分析OFFICE宏恶意样本

    零.绪论:OLE工具套件的介绍 OLE工具套件是一款针对OFFICE文档开发的具有强大分析功能一组工具集.这里主要介绍基于Python2.7的OLEtools的安装和使用. (1)Python版本需求 ...

  5. 【BZOJ3932】[CQOI2015]任务查询系统 主席树

    [BZOJ3932][CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si, ...

  6. Mac OS X运行程序出现bad interpreter: operation not permitted的解决方案

    最近想在我的mac笔记本上安装gvim,从官网上下载了程序后竟然非常诡异的双击无法打开,命令行执行时系统报错: /bin/sh bad interpreter operation not permit ...

  7. VC编译选项 多线程(/MT)

    VC编译选项 多线程(/MT)多线程调试(/MTd)多线程 DLL (/MD)多线程调试 DLL (/MDd)C 运行时库                        库文件Single threa ...

  8. UESTC 485 Game(康托展开,bfs打表)

    Game Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status t ...

  9. 白话陈述之——从python脚本变化解析由路径引起的GP服务运行失败问题

    补充一下未完待续的利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化,这篇博客中主要介绍了如何实现将GP服务生成的结果输出至本地及输入输出路径导致GP服务运行失败的问 ...

  10. Squeeze-and-Excitation Networks

    Squeeze-and-Excitation Networks Paper 近些年来,卷积神经网络在很多领域都取得了巨大的突破.而卷积核作为卷积神经网络的核心,通常被看做是在局部感受野上,将空间上(s ...