defineProperty是什么:

该函数可以直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。通俗理解就是:

给对象添加一个新的属性,或者针对对象里的某些属性,可以给这个属性设置一些特性,比如是否只读,是否可以被for..inObject.keys()遍历等

语法:

  1. Object.defineProperty(obj, prop, descriptor)

例如:

  1. var obj = {};
  2.  
  3. Object.defineProperty(obj, "key", {
  4. enumerable: false,
  5. configurable: false,
  6. writable: false,
  7. value: "static"
  8. });

设置特性的方式有2种:数据描述符存取描述符。

数据描述符存取描述符都具有以下2个属性:

configurable:  是否可以删除目标属性或是否可以再次修改属性的特性

enumerable:  此属性是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。

数据描述符另外具有以下2个属性:

writable: 属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false

value: 属性对应的值,可以使任意类型的值,默认为undefined

存取描述符另外具有以下2个属性:

getter :是一种获得属性值的方法

setter:是一种设置属性值的方法。

get于set具体用法如下:

  1. var obj = {},book = '三国演义';
  2.  
  3. Object.defineProperty(obj,'book',{
  4. get: function(){
          //返回经过处理后的变量
  5. return '<<'+book+'>>'
  6. },
  7. set: function(val){
        //利用临时变量接收赋值
  8. book = val
  9. }
  10. })
  11.  
  12. console.log(obj.book) ==> "<<三国演义>>"
  13.  
  14. obj.book = '西游记'
  15.  
  16. console.log(obj.book) ==> "<<西游记>>"

该方式可以实现对某些属性返回特定格式的值。如果觉得临时变量不好看,可以换成下面的写法:

  1. var obj = {__book:'三国演义'}
  2.  
  3. Object.defineProperty(obj,'book',{
  4. get: function(){
          
  5. return '<<'+this.__book+'>>'
  6. },
  7. set: function(val){
         //this指向原对象,定义一个属性用来接收赋值
  8. this.__book = val
  9. }
  10. })
  11.  
  12. console.log(obj.book) ==> "<<三国演义>>"
  13.  
  14. obj.book = '水浒传'
  15.  
  16. console.log(obj.book) ==> "<<水浒传>>"

注意:get或set不是必须成对出现,任写其一就可以。如果不设置方法,则get和set的默认值为undefined

 

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

 

 

理解Object.defineProperty函数中的get与set的更多相关文章

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

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

  2. 理解 Object.defineProperty

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

  3. 理解Object.defineProperty()

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

  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. 理解 JS 回调函数中的 this

    任何变量或对象都有其赖以生存的上下文.如果简单地将对象理解为一段代码,那么对象处在不同的上下文,这段代码也会执行出不同的结果. 例如,我们定义一个函数 getUrl 和一个对象 pseudoWindo ...

  9. 深入理解ES6箭头函数中的this

    简要介绍:箭头函数中的this,指向与一般function定义的函数不同,比较容易绕晕,箭头函数this的定义:箭头函数中的this是在定义函数的时候绑定,而不是在执行函数的时候绑定. 1.何为定义时 ...

随机推荐

  1. SSM框架下 Failed to load resource: the server responded with a status of 404 (Not Found)错误

    这个错误提示的是js的引用路径有错: 1.检查应用路径是否正确(我的问题是路径是正确的但是去到页面就会提示404错误) 引用路径,最好都使用绝对路径 <script type="tex ...

  2. [转载]Oracle用户创建及权限设置

    出处:https://www.cnblogs.com/buxingzhelyd/p/7865194.html 权限: create session  允许用户登录数据库权限 create table  ...

  3. Eclipse中tomcat启动时报jar包 it's not a class错误;

    Console报错如上: 解决方法: 在Eclipse中Servers文件夹下 对应的项目文件中catalina.properties文件中tomcat.util.scan.DefaultJarSca ...

  4. requirejs官网

    http://www.requirejs.cn/

  5. UIPresentationController - iOS自定义模态弹出框

    参考: https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Definin ...

  6. java中‘\'和'/'的区别

    斜杠“/”表示地址路径的下一级目录:反斜杠“\”表示转义字符,例如:要做制表,可以输入:\t:做换行:\n等.如果要输出反斜杠“\”也需要用转义字符:“\\”    在java中后台给前台传的时候如果 ...

  7. MySQL:Download Connector/Python

    MySQL Connector / Python是用于Python平台和开发的标准化数据库驱动程序. 此外,MySQL Connector / Python 8.0支持使用MySQL Server 8 ...

  8. vue filters中使用data中数据

    vue filters中 this指向的不是vue实例,但想要获取vue实例中data中的数据,可以采用下面方法.在 beforeCreate中将vue实例赋值给全局变量app0,然后filters中 ...

  9. 论文笔记:Heterogeneous Memory Enhanced Multimodal Attention Model for Video Question Answering

    Heterogeneous Memory Enhanced Multimodal Attention Model for Video Question Answering 2019-04-25 21: ...

  10. 【使用指南】ComponentOne Enterprise .NET开发控件集

    为方便广大 .NET开发人员更好的使用 ComponentOne Enterprise .NET开发控件集,葡萄城专门推出了 ComponentOne Enterprise 使用指南,该指南详细地介绍 ...