理解Object.defineProperty()

Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

基本语法:Object.defineProperty(obj, prop, descriptor)
@param obj 【必须】目标对象
@param prop【必须】新增或修改的属性名字
@param descriptor 属性描述符。
属性描述符 包括两种形式:数据描述符和存取描述符。数据描述符是一个拥有可写或不可写值的属性。存取描述符是由一对getter-setter函数功能来描述的属性。
但是该两者不能同时存在,描述符只能是其中之一。

一:数据描述符:
比如如下一个普通对象:

var obj = {
"name": "kongzhi"
};

数据描述符属性如下:

Object.defineProperty(obj, "name", {
configurable: true | false,
enumerable: true | false,
value: '任意类型的值',
writable: true | false
});

下面我们来理解下每个属性的含义:

1. value:
含义: 属性的值,可以是任何类型的值,默认为undefined

1-1 不设置value属性
如下代码:

var obj = {};
Object.defineProperty(obj, "name", {});
console.log(obj.name); // undefined

1-2 设置value属性

// 设置value 代码如下:
var obj = {};
Object.defineProperty(obj, "name", {
value: "kongzhi"
});
console.log(obj.name); // kongzhi

2. writable

含义:属性的值是否可以被重写,true: 可以被重写,false: 不能被重写。默认为false。

2-1 writable设置为false,不能重写,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
value: "kongzhi",
writable: false
});
// 先打印下值
console.log(obj.name); // kongzhi
// 更改值
obj.name = "longen";
// 再打印下
console.log(obj.name); // kongzhi

2-2 writable设置为true,可以被重写,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
value: "kongzhi",
writable: true
});
// 先打印下值
console.log(obj.name); // kongzhi
// 更改值
obj.name = "longen";
// 再打印下
console.log(obj.name); // longen

3. enumerable

含义:该属性是否可以被枚举(如:for..in 或 Object.keys()). 如果为true的话,可以被枚举,设置为false的话,不能被枚举,默认为false。

3-1 enumerable被设置为false,不能被枚举,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
value: "kongzhi",
writable: false,
enumerable: false
});
// 先打印对象一下看看
console.log(obj); // {name: "kongzhi"} // 再枚举对象的属性
for(var attr in obj) {
console.log(attr); // 什么都没有输出 说明不能被枚举
}

3-2 enumerable 设置为true,可以被枚举,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
value: "kongzhi",
writable: false,
enumerable: true
});
// 先打印对象一下看看
console.log(obj); // {name: "kongzhi"} // 再枚举对象的属性
for(var attr in obj) {
console.log(attr); // 输出 name
}

4. configurable

含义:是否可以删除目标属性或是否可以修改目标属性的特性。如果为true的话,可以被删除或可以修改属性,为false的话,不能删除目标属性或不能修改目标属性,默认为false

4-1 configurable: false, 为false的话,不能删除目标属性或不能修改目标属性。如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
value: "kongzhi",
writable: false,
enumerable: false,
configurable: false
});
// 先打印对象一下看看
console.log(obj); // {name: "kongzhi"} // 删除属性
delete obj.name;
// 重新打印下对象,看是否删除成功了
console.log(obj.name); // kongzhi // 修改属性
obj.name = "longen";
// 重新打印下对象,看是否修改成功了
console.log(obj.name); // kongzhi

4-2 configurable: true, 可以删除目标属性 或 可以修改目标属性,如下代码:

var obj = {};
Object.defineProperty(obj, "name", {
value: "kongzhi",
writable: false,
enumerable: false,
configurable: true
});
// 先打印对象一下看看
console.log(obj); // {name: "kongzhi"} // 删除属性
delete obj.name;
// 重新打印下对象,看是否删除成功了
console.log(obj.name); // undefined // 修改属性
obj.name = "longen";
// 重新打印下对象,看是否修改成功了
console.log(obj.name); // longen

二: 存取器描述
使用存取器描述属性的时候,可以使用如下属性:

var obj = {};
Object.defineProperty(obj, "name", {
enumerable: true | false,
configurable: true | false,
get: function() {} | undefined,
set: function(value) {} | undefined
});

注意:当使用了getter或setter的时候,就不能使用writable和value这两个属性。否则会报错。

getter 是获取属性值的方法。如果没有getter 则默认为 undefined,当我们读取某个属性的时候,其实是在对象内部调用了该方法,该方法必须使用return语句,返回值被作为属性值。
setter 是设置属性的方法。如果没有setter,则默认为undefined,该方法接收一个参数,并将该参数值分配该属性。当我们设置某个属性的时候,实际上在对象的内部调用了该方法。

如下代码是使用getter和setter的代码:

var obj = {};
var initValue = "kongzhi";
Object.defineProperty(obj, "name", {
get: function() {
// 当获取属性值的时候触发的函数
return initValue;
} ,
set: function(value) {
// 当设置值的时候触发的函数
initValue = value;
}
});
// 获取值
console.log(obj.name); // kongzhi // 设置值
obj.name = "longen";
// 打印下
console.log(obj.name); // longen

理解Object.defineProperty()的更多相关文章

  1. 深入理解 Object.defineProperty 及实现数据双向绑定

    Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作.何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外 ...

  2. 理解 Object.defineProperty

    理解 Object.defineProperty 本文写于 2020 年 10 月 13 日 Object.defineProperty 用于在一个对象上定义新的属性或修改现有属性并返回该对象. 什么 ...

  3. 理解Object.defineProperty函数中的get与set

    defineProperty是什么: 该函数可以直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象.通俗理解就是: 给对象添加一个新的属性,或者针对对象里的某些属性,可以给这 ...

  4. 理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...

  5. [转] 理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...

  6. 《转》理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...

  7. 简单的理解 Object.defineProperty()

    Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性. Object.defineProperty(obj,prop,descriptor ...

  8. vue之Object.defineProperty()

    了解Object.defineProerty()方法 关于Object.defineProperty()方法的解释,理解Object.defineProperty的作用 这篇文章做了很详细的概述 关于 ...

  9. 浅谈兔兔对Object.defineProperty的理解

    给一个对象定义一个新的属性或者在修改一个对象现有的属性,并返回这个对象 语法: Object.defineProperty(参数1,参数2,参数3) 参数1:目标对象 参数2:要修改或者添加的属性名称 ...

随机推荐

  1. django作业2

    管理后台 1.登陆Form 2.Session (用装饰器实现) 3.装饰器 4.主机,主机组 添加(主机,主机组) 删除 修改 查询

  2. Python 面向对象(三) 魔术方法

    __getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...

  3. 流式处理的新贵 Kafka Stream - Kafka设计解析(七)

    原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/kafka_stream/ Kafka Stream背景 Ka ...

  4. android shape 大全 (转)

    1. 各属性的配置语法 在项目 res/drawable 文件夹中创建一个以 shape 为根节点的 XML 文件,基本语法如下: <?xml version="1.0" e ...

  5. Winform界面中实现通用工具栏按钮的事件处理

    在一个给客户做的项目中,界面要求修改增加通用工具栏按钮的事件处理,也就是在主界面中放置几个固定的功能操作按钮,打开不同的页面的时候,实现对应页面的功能处理,这种和我标准的界面处理方式有所不同,标准的列 ...

  6. e2e测试之Nightmare

    一.e2e测试简介 e2e或者端到端(end-to-end)或者UI测试是一种测试方法,它用来测试一个应用从头到尾的流程是否和设计时候所想的一样.简而言之,它从一个用户的角度出发,认为整个系统都是一个 ...

  7. 崩溃 golang入坑系列

    早上(11.30)收到邮件,Vultr东京机房网络故障.当时搭建SS时,考虑到了机房故障.所以特意分出了日本和香港两条线路.但千算万算,忘记数据库还在东京机房中. 现在网络故障,SS服务器无法读取数据 ...

  8. 简单购物车程序(Python)

    #简单购物车程序:money_all=0tag=Trueshop_car=[]shop_info={'apple':10,'tesla':100000,'mac':3000,'lenovo':3000 ...

  9. unity中Ray、RaycastHit 、Raycast(小白之路)

    1.Ray Ray(Vector3 origin, Vector3 direction) Ray:在程序中可以理解为射线,就是以某个位置(origin)朝某个方向(direction)的一条射线,是一 ...

  10. LVM挂载失败mount: you must specify the filesystem type

    因意外原因导致机器重启,机器起来后发现磁盘挂载没有了,挂载,结果报错 [root@all /]# mount /dev/hdc2 /mnt/cdrom mount: you must specify ...