当前位置: 首页 > news >正文

建设网站主机要买什么的好什么样的公司才叫企业

建设网站主机要买什么的好,什么样的公司才叫企业,网页代码制作基础教程,做电影网站服务器深入浅出JavaScript访问器属性:优雅掌控对象的“门卫” 在JavaScript的世界中,对象是数据的容器,而属性则是对象的“门卫”。我们通常认为对象的属性就是存储数据的地方,比如person.name "John",但JavaScr…

深入浅出JavaScript访问器属性:优雅掌控对象的“门卫”

在JavaScript的世界中,对象是数据的容器,而属性则是对象的“门卫”。我们通常认为对象的属性就是存储数据的地方,比如person.name = "John",但JavaScript的灵活性远不止于此。它允许我们通过访问器属性(Accessor Properties)定义更复杂的逻辑——这些属性并不直接存储数据,而是通过gettersetter函数控制数据的读取和写入。

本文将带你深入理解访问器属性的原理、使用场景以及如何在代码中灵活运用它们。


一、什么是访问器属性?

访问器属性是对象属性的一种特殊类型,它通过函数来管理属性的读取和写入操作。与普通的数据属性不同,访问器属性本身不存储值,而是通过getter(获取)和setter(设置)函数间接操作数据。

核心特性

  1. get函数:当读取属性时自动调用,返回一个值。
  2. set函数:当写入属性时自动调用,接收新值并执行逻辑。
  3. 不可同时拥有valuewritable特性:访问器属性与数据属性(直接存储值的属性)是互斥的。

访问器属性的定义方式有两种:

  • 使用Object.defineProperty()方法(ES5及以后)。
  • 在类(Class)中使用getset关键字(ES6及以后)。

二、访问器属性的定义方式

1. 使用Object.defineProperty()(ES5)

这是最传统的定义方式,通过Object.defineProperty()方法为对象添加访问器属性。

const person = {firstName: "John",lastName: "Doe"
};// 定义fullName访问器属性
Object.defineProperty(person, "fullName", {get() {return `${this.firstName} ${this.lastName}`;},set(value) {const [first, last] = value.split(" ");this.firstName = first;this.lastName = last;},enumerable: true, // 可枚举configurable: true // 可配置
});// 使用访问器属性
console.log(person.fullName); // 输出: John Doe
person.fullName = "Jane Smith";
console.log(person.firstName); // 输出: Jane
console.log(person.lastName); // 输出: Smith

代码解析

  • get函数在读取person.fullName时自动调用,返回拼接后的全名。
  • set函数在写入person.fullName时自动调用,将输入的字符串拆分为firstNamelastName

2. 使用类语法(ES6+)

ES6引入了类的语法糖,使访问器属性的定义更简洁:

class Person {constructor(firstName, lastName) {this.firstName = firstName;this.lastName = lastName;}get fullName() {return `${this.firstName} ${this.lastName}`;}set fullName(value) {const [first, last] = value.split(" ");this.firstName = first;this.lastName = last;}
}const user = new Person("John", "Doe");
console.log(user.fullName); // 输出: John Doe
user.fullName = "Jane Smith";
console.log(user.firstName); // 输出: Jane

对比

  • 类语法更直观,适合面向对象的开发场景。
  • Object.defineProperty()更灵活,适合动态修改对象属性或兼容旧代码。

三、访问器属性的应用场景

1. 数据验证

通过setter函数,可以在写入属性时验证数据的有效性。

const user = {_age: 0
};Object.defineProperty(user, "age", {get() {return this._age;},set(value) {if (value < 0) {console.error("年龄不能为负数!");return;}this._age = value;}
});user.age = 25; // 正常设置
user.age = -5; // 输出错误信息,_age保持0

2. 动态计算属性

访问器属性可以动态计算值,避免冗余存储。

const rectangle = {width: 10,height: 20
};Object.defineProperty(rectangle, "area", {get() {return this.width * this.height;}
});console.log(rectangle.area); // 输出: 200
rectangle.width = 15;
console.log(rectangle.area); // 输出: 300(无需手动更新)

3. 格式化输出

通过getter统一数据格式,隐藏内部实现细节。

const product = {price: 100
};Object.defineProperty(product, "formattedPrice", {get() {return `$${this.price.toFixed(2)}`;}
});console.log(product.formattedPrice); // 输出: $100.00

4. 触发副作用

setter中执行额外操作,比如日志记录或更新关联属性。

const counter = {count: 0
};Object.defineProperty(counter, "increment", {set(value) {this.count = value;console.log(`计数已更新为: ${this.count}`);}
});counter.increment = 5; // 输出: 计数已更新为: 5

四、访问器属性的注意事项

1. 性能开销

访问器属性涉及函数调用,相比直接访问数据属性会稍慢。因此,在对性能敏感的场景(如高频操作)中需谨慎使用。

2. 与数据属性的互斥性

访问器属性不能与数据属性(valuewritable)共存。如果尝试为同一属性定义两者,Object.defineProperty()会抛出错误。

3. 默认特性值

  • configurable: 默认为false,设置为true后可删除或修改属性。
  • enumerable: 默认为false,设置为true后可通过for...in循环遍历。

4. 兼容性

Object.defineProperty()在ES5中被标准化,但IE8及以下版本不支持。若需兼容旧浏览器,需使用Polyfill或回退方案。


五、访问器属性 vs 数据属性

特性数据属性访问器属性
存储值直接存储值(value不存储值,通过函数操作
可读写性writable控制getset控制
可枚举性enumerable控制enumerable控制
可配置性configurable控制configurable控制
适用场景简单数据存储数据验证、计算、格式化

六、总结

访问器属性是JavaScript中非常强大的特性,它通过gettersetter函数赋予开发者对属性的完全控制权。无论是数据验证、动态计算,还是格式化输出,访问器属性都能优雅地解决复杂场景下的需求。

作为开发者,理解访问器属性的原理和使用场景,不仅能提升代码的灵活性和健壮性,还能帮助我们更好地设计面向对象的程序。下次当你需要为对象添加“智能属性”时,不妨试试访问器属性——这扇门后的世界,远比你想象的更精彩!

http://www.yayakq.cn/news/88226/

相关文章:

  • 域名备案注销wordpress怎么设置seo
  • 自己的网站做怎样的优化调整wordpress带灯箱的主题
  • 用visual做网站智能网站建设策划
  • 上虞网站建设文广网络课程网站开发 预算
  • 吉安市城乡规划建设局网站景县做个油管的网站怎么做
  • 社交网站建设教程网络营销指导如何做
  • 进不去的网站用什么浏览器甘肃省住房和城乡建设厅安置局网站
  • 盐田区网站建设太原建网站
  • 计算机系部网站开发背景中国建筑文兵简历
  • 信得过的网站开发推广物流公司网站建设方案
  • 网站建设新闻如何更新验证wordpress
  • 网站建设一般花多少费用wordpress 5.0.2主题
  • 建一个网站要...如何创建个人app
  • 西海岸城市建设局网站温州建设小学 网站首页
  • wordpress建电影网站天河公司网站建设
  • 做网站分成wordpress 读取数据的地方
  • 网站设计页面个人简历制作免费
  • 仿网站上的焦点图做g3云推广需要网站
  • 做网站怎样连数据库奉化网站建设报价
  • 湘潭交通网站购物网站建设基本流程树状图
  • 邯郸网站开发公司电话长沙网站托管哪家好
  • dt高端网站设计注册中文域名
  • 江苏网站建设效果好乐从网站建设
  • 郑州网站关百度给公司做网站效果咋样
  • 四川网站建设服务公司从事建站业务还有前景吗
  • 通州专业网站制作手机app与手机网站的区别
  • 东莞做网站seo兴平网站开发
  • 手机h5网站设计网站推荐室内
  • 专业网站建设的意义uc官方网站开发中心
  • wordpress 设置站点地址三合一网站建站