浅谈JS对象添加getter与setter的5种方法

下面我将详细讲解“浅谈JS对象添加getter与setter的5种方法”的完整攻略。

1. 什么是getter和setter函数?

在介绍添加getter和setter函数的方法之前,先来简单了解一下什么是getter和setter函数。

getter和setter函数是用于访问和设置对象属性的函数。通常情况下,使用getter和setter函数可以保证对象的属性不被直接访问,从而增强了数据的安全性和可控性。

一个简单的例子:

let obj = {
  _age: 20,
  get age() {
    return this._age;
  },
  set age(value) {
    if (value < 0) {
      console.error('Age cannot be negative');
      return;
    }
    this._age = value;
  }
};
console.log(obj.age); // 20
obj.age = -10; // Age cannot be negative
console.log(obj.age); // 20
obj.age = 30;
console.log(obj.age); // 30

从上面的例子可以看出,我们使用了getter和setter函数,访问和设置对象的_age属性。我们在setter中加了一层判断,如果value小于0,则返回错误提示,否则正常设置属性值。

2. 5种添加getter和setter函数的方法

下面将介绍5种添加getter和setter函数的方法。

2.1 Object.defineProperty()

Object.defineProperty()方法可以在一个对象上定义一个新属性或者修改一个对象的现有属性,并且可以定义这个属性的特性。

let obj = {};
Object.defineProperty(obj, 'age', {
  get: function() {
    return this._age;
  },
  set: function(value) {
    if (value < 0) {
      console.error('Age cannot be negative');
      return;
    }
    this._age = value;
  }
});
console.log(obj.age); // undefined
obj.age = -10; // Age cannot be negative
console.log(obj.age); // undefined
obj.age = 30;
console.log(obj.age); // 30

2.2 ES6 class中添加getter和setter

ES6 class中添加getter和setter函数,可以直接在class中使用get和set关键字。

class Person {
  constructor() {
    this._age = 20;
  }
  get age() {
    return this._age;
  }
  set age(value) {
    if (value < 0) {
      console.error('Age cannot be negative');
      return;
    }
    this._age = value;
  }
}
const p = new Person();
console.log(p.age); // 20
p.age = -10; // Age cannot be negative
console.log(p.age); // 20
p.age = 30;
console.log(p.age); // 30

2.3 立即执行函数(IIFE)+闭包生成getter和setter

使用立即执行函数(IIFE)+闭包,可以生成新的get和set函数,并将它们作为对象的属性。

let obj = (function() {
  let _age = 20;
  return {
    get age() {
      return _age;
    },
    set age(value) {
      if (value < 0) {
        console.error('Age cannot be negative');
        return;
      }
      _age = value;
    }
  };
})();
console.log(obj.age); // 20
obj.age = -10; // Age cannot be negative
console.log(obj.age); // 20
obj.age = 30;
console.log(obj.age); // 30

2.4 ES5 Object.prototype方法

可以使用ES5中Object.prototype方法,将getter和setter函数添加到所有对象中。

Object.defineProperty(Object.prototype, 'age', {
  get: function() {
    return this._age;
  },
  set: function(value) {
    if (value < 0) {
      console.error('Age cannot be negative');
      return;
    }
    this._age = value;
  }
});
let obj = {};
console.log(obj.age); // undefined
obj.age = -10; // Age cannot be negative
console.log(obj.age); // undefined
obj.age = 30;
console.log(obj.age); // 30

2.5 原型链

最后一种添加getter和setter的方法是使用原型链。

let Person = function() {};
Person.prototype = {
  get age() {
    return this._age;
  },
  set age(value) {
    if (value < 0) {
      console.error('Age cannot be negative');
      return;
    }
    this._age = value;
  }
};
let p = new Person();
console.log(p.age); // undefined
p.age = -10; // Age cannot be negative
console.log(p.age); // undefined
p.age = 30;
console.log(p.age); // 30

3. 总结

通过以上的5种方法,我们可以很方便地添加getter和setter函数,从而来保证对象属性的安全性和可控性。但是需要注意的是,在getter函数中不要对对象属性进行修改操作,否则会造成无限递归的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈JS对象添加getter与setter的5种方法 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 简单实现ajax获取跨域数据

    实现ajax跨域获取数据在Web开发中非常常见,由于浏览器的同源策略,直接在页面中通过ajax获取跨域数据是不允许的,但是我们可以通过JSONP和CORS两种方式来实现跨域数据获取。 JSONP JSONP(JSON with Padding)是一种基于JSON的数据交互方式,它允许我们通过在页面上动态创建标签的方式来实现跨域数据获取。JSONP的原理是利用…

    JavaScript 2023年6月11日
    00
  • JavaScript如何动态监听DOM元素高度详解

    JavaScript如何动态监听DOM元素高度,可以通过以下步骤来完成: 步骤1:首先要获取需要监听高度的DOM元素,并给它设置高度的初始值,可以通过JavaScript代码来实现。 例如,获取ID为box的DOM元素,并设置它的高度初始值为400像素: var box = document.getElementById("box"); …

    JavaScript 2023年6月10日
    00
  • ajax实现简单实时验证功能

    下面是“ajax实现简单实时验证功能”的攻略: 什么是Ajax实时验证 Ajax是一种用于创建快速动态Web网页的技术,通过在不刷新页面的情况下向服务器发送请求并获取响应数据,可以实现实时验证表单数据的功能。 通常在前端验证数据的时候,我们会通过JavaScript来实现,但是客户端验证容易被用户绕过,所以我们还需要在后端进行验证。而利用Ajax可以在前端先…

    JavaScript 2023年6月10日
    00
  • JS实现单例模式的6种方案汇总

    下面我就详细讲解一下“JS实现单例模式的6种方案汇总”的完整攻略。 什么是单例模式 单例模式是一种常用的设计模式,它可以确保一个类只有一个实例,并提供了一个全局访问点。这对于管理共享的资源非常有用,比如线程池、数据库连接池等。 为什么要使用单例模式 使用单例模式可以避免不必要的资源浪费,提高程序性能,并且可以确保全局的一致性。 6种方案汇总 1. 普通模式 …

    JavaScript 2023年6月10日
    00
  • Javascript中的高阶函数介绍

    Javascript中的高阶函数介绍 在Javascript中,高阶函数是一种非常常见的函数类型,它们能够接收一个或多个函数作为参数,并且返回一个新的函数。本篇文章将详细讲解高阶函数的基本概念、优点和示例。 高阶函数的基本概念 高阶函数是函数式编程中非常重要的一种概念。根据Javascript的语言特性,任何函数都可以作为参数传递给另一个函数,并且也可以将函…

    JavaScript 2023年5月27日
    00
  • 在javascript中如何得到中英文混合字符串的长度

    在javascript中计算中英文混合字符串长度,需要考虑到中文字符在计算长度时是占两个字节的。下面提供几种方法来实现计算中英文混合字符串长度的功能。 方法一:利用正则表达式匹配中文字符并计算长度 将中文字符在Unicode范围中的编码区间转换成正则表达式的形式 [\u4e00-\u9fa5],代表是包含了中文的unicode编码。 将字符串中所有的中文字符…

    JavaScript 2023年5月28日
    00
  • 基于Tomcat安全配置与性能优化详解

    基于Tomcat安全配置与性能优化详解 安全配置 HTTPS配置 HTTP是明文传输,不安全,而HTTPS通过SSL/TLS进行加密传输,可以提高传输的安全性。因此,我们需要为Tomcat配置HTTPS,具体步骤如下: 生成证书 我们可以通过如下命令来生成证书: keytool -genkey -alias tomcat -keyalg RSA -keyst…

    JavaScript 2023年5月28日
    00
  • threejs后期处理的基本使用方法之加特效

    Threejs后期处理的基本使用方法之加特效 前言 在Three.js中,后期处理是在渲染器执行完菜单渲染中的所有对象之后对渲染结果进行筛选和修改的一种技术。Three.js提供了多种后期处理方法,如全屏像素化、阴影、镜面反射等等。本攻略将介绍Three.js中加特效的基本使用方法,希望可以帮到你。 加特效 加特效(GlitchPass)是Three.js中…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部