242 Object.defineProperty

Object.defineProperty:设置或修改对象中的属性。

Object.defineProperty(obj, prop, descriptor)。

obj:必需,目标对象
prop:必需,需定义或修改的属性的名字
descriptor:必需,目标属性所拥有的特性
Object.defineProperty() 第三个参数 descriptor 说明:
(1)value: 设置或新增的属性的值 【默认是undefined。】

(2)writable: 值是否可以重写,true | false,默认值是false 【如果第一次设置的时候,为false,后面改为true,再设置value,会报错】

(3)enumerable: 目标属性是否可以被枚举,true | false,默认的值是 false

(4)configurable: 目标属性是否可以被删除,或是否可以再次修改特性 true | false,默认的值是 false 【第一次设置后,允许再修改第三个参数里面的特性,即不能再修改属性的enumerable、configurable】
Object.defineProperty(对象,修改或新增的属性名,{
        value: 修改或新增的属性的值,
        writable: true/false,  // 如果值为false,不允许修改这个属性值
        enumerable: false,    // enumerable 如果值为false,则不允许遍历
        configurable: false   // 属性是否可以被删除,或是否可以再次修改特性,configurable 如果为false,则不允许删除这个属性
})  
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // Object.defineProperty() 定义新属性或修改原有的属性
        var obj = {
            id: 1,
            pname: '华为',
            price: 1999
        };
        // 1. 以前的对象添加和修改属性的方式
        // obj.num = 1000;
        // obj.price = 99;
        // console.log(obj);

        // 2. Object.defineProperty() 定义新属性或修改原有的属性
        Object.defineProperty(obj, 'num', {
            value: 1000,
            enumerable: true
        });
        console.log(obj); // {id: 1, pname: "华为", price: 1999, num: 1000}

        Object.defineProperty(obj, 'price', {
            value: 9.9
        });
        console.log(obj); // {id: 1, pname: "华为", price: 9.9, num: 1000}

        Object.defineProperty(obj, 'id', {
            // 如果值为false 不允许修改这个属性值 默认值也是false
            writable: false,
        });
        obj.id = 2;
        console.log(obj); // (1)修改失败,因为writable: false;(2){id: 1, pname: "华为", price: 9.9, num: 1000}

        Object.defineProperty(obj, 'address', {
            value: '深圳',
            // 如果只为false 不允许修改这个属性值 默认值也是false
            writable: false,
            // enumerable 如果值为false 则不允许遍历, 默认的值是 false
            enumerable: false,
            // configurable 如果为false 则不允许删除这个属性 不允许再修改第三个参数里面的特性 默认为false
            configurable: false
        });
        console.log(obj); // {id: 1, pname: "华为", price: 9.9, num: 1000, address: "深圳"}
        console.log(Object.keys(obj)); // ["id", "pname", "price", "num"]

        delete obj.address; // 不能删除,因为configurable: false
        console.log(obj); // {id: 1, pname: "华为", price: 9.9, num: 1000, address: "深圳"}

        delete obj.pname; // 删除成功
        console.log(obj); // {id: 1, price: 9.9, num: 1000, address: "深圳"}

        Object.defineProperty(obj, 'address', {
            value: '中国山东蓝翔技校xx单元',
            // 如果只为false 不允许修改这个属性值 默认值也是false
            writable: true,
            // enumerable 如果值为false 则不允许遍历, 默认的值是 false
            enumerable: true,
            // configurable 如果为false 则不允许删除这个属性 默认为false
            configurable: true
        });
        console.log(obj.address); //
    </script>
</body>

</html>

原文地址:https://www.cnblogs.com/jianjie/p/12229142.html

时间: 2024-11-03 10:39:16

242 Object.defineProperty的相关文章

Object.defineProperty 中的 writable 和 configurable 和 enumerable 的理解

在现在比较新的框架中, 比如 reactjs, vuejs中用得很多的一个属性便是 Object.defineOProperty 此属性的文档在网上一搜, 其中的几个属性, 包括 存取描述符(有set和get的) 和 数据描述符(直接有 value 的就是数据描述符) 有 set get 有 value writable enumerable configurable 虽然有 set 和 get, 但是定义的时候还是要用到 enumerable 和 configurable set 和 get

Object.defineProperty小解

最早认识这个函数,源于对vue双向绑定的探索,vue通过这个函数实现属性挟持并结合发布者-订阅者模式实现双向绑定 先看一个实例: var o= {name: 'a'} Object.defineProperty(o, 'value', { value: 3, writable: true, enumerable: true, cofigurable: true }) console.log(o.value) //3 三个参数,分别是目标对象.属性名称.参数对象 value:属性值 writabl

解析神奇的 Object.defineProperty

这个方法了不起啊..vue.js是通过它实现双向绑定的..而且Object.observe也被草案发起人撤回了..所以defineProperty更有必要了解一下了. 几行代码看他怎么用 var a= {} Object.defineProperty(a,"b",{ value:123 }) console.log(a.b);//123 很简单,它接受三个参数,而且都是必填的.. 传入参数 第一个参数:目标对象 第二个参数:需要定义的属性或方法的名字. 第三个参数:目标属性所拥有的特性

MVVM双向绑定实现之Object.defineProperty

随着web应用的发展,直接操作dom的应用已渐行渐远,取而代之的是时下越来越流行的MVVM框架,dom操作几乎绝迹,这里面自然是框架底层封装的结果.MVVM框架的双向数据绑定使开发效率大大提高:然后在实现这些双向数据绑定时,使用ES7原生的Object.observe方法则是完美解决方案,但是遗憾的是该方法目前还是ES7的草案阶段,各浏览器还不支持,目前chrome 36+支持该方法. 既然Object.observe不被支持,但是其替代方案是ECMAScript 262v5带来的新东西Obje

Javascript Object.defineProperty()

转载声明: 本文标题:Javascript Object.defineProperty() 本文链接:http://www.zuojj.com/archives/994.html,转载请注明转自Benjamin-专注前端开发和用户体验 Javascript作为一种语言,有个美誉,开发者可以重新定义任何事情.虽然这在过去的一些javascript可以,但是ECMAScript5中已经开始得到改变,例如,我们可以使用Object.defineProperty创建一个不能被修改的对象的属性.本文中我们

Object.defineproperty实现数据和视图的联动

Object.defineproperty语法 在一个对象上定义新的属性 var o = {}; // 创建一个新对象 // Example of an object property added with defineProperty with a data property descriptor Object.defineProperty(o, "a", {value : 37, writable : true, enumerable : true, configurable :

Object.defineProperty(obj,prop,descriptor)简单使用

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>javascript test</title> <script type="text/javascript" src="js/jquery.min.js"></script> <style> body { padding:

Object.defineProperty与修改某个数组实现监听效果

1.Object.defineProperty Object.defineProperty具体资料:传送门 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> /*Object.defineP

Js中的Object.defineProperty

通过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等) 备注:如果通过var obj = {} obj.age = 18这种方式设置的属性,他的可见性,可配置性,可枚举性等都为true,相当于默认设置了本篇讨论的各种属性都为true 语法:Object.defineProperty(obj, prop, descriptor) 第一个参数:目标对象第二个参数:需要定义的属性或方法的名字.第三个参数:目标属性所拥有的特性.(descrip