JavaScript | 数据属性与访问器属性

属性类型

数据属性 - 包含一个数据值的位置,可以读取和写入值

[writable]

是否能修改属性的值

true

[enumerable]

是否通过for in 循环返回属性(是否可以被枚举)

true

[configurable]

是否能通过delete删除,能否修改属性的特性,能否修改访问器属性

true

[value]

包含这个属性的数据值,读取属性值的时候从这个位置读取。

undefined

访问器属性

[enumerable]

是否通过for in 循环返回属性(是否可以被枚举)

true

[configurable]

是否能通过delete删除,能否修改属性的特性,能否修改访问器属性

true

[get]

读取属性时调用的函数

undefined

[set]

写入属性时调用的函数

undefined

属性操作

  • 定义属性:Object.defineProperty()
  • 查看属性:Object.getOwnPropertyDescriptor()
复制代码
"use strict";
// *****************************************************************
// 操作数据属性
var person = {
    name: 'hugh',
    age: 29,
    sayName: function() { console.log(1); }
}
// 修改属性默认特性:Object.defineProperty()
Object.defineProperty(person, "name", {
    writable: true,
    value: 'dong',
    configurable: false,
    enumerable: false
});
console.log(person);

// *****************************************************************
// 操作访问器属性
var book = {
    _year: 2004, // _作为标记只能通过对象访问的属性
    edition: 0
};
Object.defineProperty(book, "year", {
    // 访问器属性year包含setter和getter函数
    get: function() {
        return this._year;
    },
    set: function(newValue) {
        this._year = newValue;
        this.edition = newValue - 2004;
    }
})
book.year = 2008;
console.log(book);
console.log(book.edition);
// 旧方法,ie8部分不支持defineProperty()
// 严格模式不可用
// book._defineGetter_("year",function(){
//     return this._year;
// });
// book._defineSetter_("year",function(newValue){
//     this._year = newValue;
//     this.edition = newValue - 2014;
// });

// *****************************************************************
// 定义多个属性
var book2 = {};
Object.defineProperties(book2, {
    // 数据属性
    _year: {
        value: 2004,
        writable: false,
        enumerable: false,
        configurable: true
    },
    edition: {
        value: 0,
        writable: false,
        enumerable: false,
        configurable: true
    },
    // 访问器属性
    year: {
        get: function() {
            return this._year;
        },
        set: function(newValue) {
            this._year = newValue;
            this.edition = newValue - 3000;
        }
    }
});
console.log(book2);

// *****************************************************************
// 查看属性的属性
console.log(Object.getOwnPropertyDescriptor(book2,'_year'));
console.log(Object.getOwnPropertyDescriptor(book2,'edition'));
console.log(Object.getOwnPropertyDescriptor(book2,'year'));
复制代码

posted @   hugh.dong  阅读(454)  评论(2编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
点击右上角即可分享
微信分享提示