JS 数据属性 & 访问器属性

简介: JS 数据属性 & 访问器属性 一个js对象(Object、Function)可以定义两种类型的属性:数据属性 或 访问器属性。

JS 数据属性 & 访问器属性

一个js对象(Object、Function)可以定义两种类型的属性:数据属性访问器属性

共同特性

数据属性和访问器属性有两个共通的特征可以设置:

  • enumerable 是否能够被 for-in 遍历枚举

  • configurable 是否能够被 delete 关键字删除

数据属性

数据属性的特征除了共同特征两种外,还有两种

  • value 定义值

  • writable 是否能够被重新赋值

数据属性是基本的值属性,我们使用普通方法创建对象时 var obj = {age:12} ,产生的属性就是数据属性,并且其 enumerableconfigurablewritable 默认设置为true

var person = {
    age:12
}
//Object {value: 12, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(person,'age');  

访问器属性

访问器属性的特征除了共同特征两种外,还有两种

  • get 访问该属性时自动调用

  • set 重新赋值该属性时自动调用

访问器属性可以方便我们在属性赋值或访问时做其他的一些操作,在定义getset方法时,注意不要使用this来访问本属性,会造成无限循环导致内存溢出。

var person = {name:"teacher",_age:12};
Object.defineProperty(person,"age",{
    get : function(){
        console.log(this)
        return this._age; // 此时不要使用this.age,会导致无限递归
    },
    set : function(newVal){
        this._age = newVal;
    }
})
person.age; // Object {name: "teacher" , _age : 12} 12

注意

坑一:定义 getset 的时候,单独定义 get 表示该属性只可访问,不可重写

var person = {name:"teacher"};
Object.defineProperty(person,"age",{
    get : function(){
        return age; // 此时不要使用this.age,会导致无限递归
    }
})
person.age; // Uncaught ReferenceError: age is not defined(…) 

person.age = 12;

person.age; // Uncaught ReferenceError: age is not defined(…)

坑二:访问器属性和数据属性只能存在一种

定义访问器属性后,会取代数据属性,丢失value

var person = {age:12};

// Object {value: 12, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(person,"age"); 

Object.defineProperty(person,"age",{
    get : function(){
        return age; // 此时不要使用this.age,会导致无限递归
    }
})

// Object {set: undefined, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(person,"age"); 

person.age; // Uncaught ReferenceError: age is not defined(…)

当两种都定义时,会报错

var person = {};
Object.defineProperty(person,"age",{
    get : function(){
        return age;
    }, // 访问器属性特征

    value : 12 // 数据属性特征
})
// Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #<Object>(…)

坑三:数据属性和访问器属性不能多次定义

var person = {};
Object.defineProperty(person,"age",{
    valule : 12
})

person.age; // 12

Object.defineProperty(person,"age",{
    value : 13
}) 
// Uncaught TypeError: Cannot redefine property: age(…)

Object.defineProperty(person,"age",{
    get : function(){
        return age;
    }
})
// Uncaught TypeError: Cannot redefine property: age(…)

双向绑定

双向绑定常常与MVVM框架一同出现,实现前端view和model的双向绑定,目前有三种方式:

  • 脏检测 (angularJS)

  • 观察机制(ES7 Object.observe)

  • 使用属性访问器 (ES5 IE9+)

相关文章
|
7月前
|
Web App开发 数据采集 JavaScript
动态网页爬取:Python如何获取JS加载的数据?
动态网页爬取:Python如何获取JS加载的数据?
1215 58
|
6月前
|
JavaScript API 开发者
在Vue.js中设置方法时访问$vuetify实例的正确姿势。
总之,访问 `$vuetify`实例是一种直观而有效的方法,它使得在Vue组件中处理Vuetify相关的逻辑成为可能。务必留意正确使用 `this`上下文,并确保在执行任何操作之前,Vue组件实例已经正确初始化并且可用。这种方式在组件自身逻辑与Vuetify的界面表现层之间架起了一座桥梁,使得开发者可以通过书写组件代码来控制和优化用户界面。
96 14
|
5月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
164 1
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
286 1
|
9月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
监控 JavaScript 前端开发
确定使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript
【10月更文挑战第24天】选择使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript 是一个需要综合考虑多个因素的决策。需要根据脚本之间的依赖关系、页面加载性能要求、脚本的功能和重要性等因素来进行权衡。在实际应用中,需要通过测试和验证来确定最适合的加载方式,以提供更好的用户体验和页面性能。
226 56
|
前端开发 JavaScript
如何在 JavaScript 中访问和修改 CSS 变量?
【10月更文挑战第28天】通过以上方法,可以在JavaScript中灵活地访问和修改CSS变量,从而实现根据用户交互、页面状态等动态地改变页面样式,为网页添加更多的交互性和动态效果。在实际应用中,可以根据具体的需求和场景选择合适的方法来操作CSS变量。
495 12
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
监控 JavaScript 前端开发
使用 `defer` 属性异步加载 JavaScript
【10月更文挑战第24天】使用 `defer` 属性异步加载 JavaScript 是一种有效的提高页面性能和用户体验的方法。通过合理设置 `defer` 属性,可以在不影响页面渲染的情况下异步加载脚本,并确保脚本的执行顺序。在实际应用中,需要根据具体情况选择合适的加载方式,并注意处理可能出现的问题,以确保页面能够正常加载和执行。
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
506 0
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南