返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中使用getter和setter有什么不好
  • 382
分享到

JavaScript中使用getter和setter有什么不好

2024-04-02 19:04:59 382人浏览 泡泡鱼
摘要

本篇内容介绍了“javascript中使用getter和setter有什么不好”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅

本篇内容介绍了“javascript中使用getter和setter有什么不好”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

如你所知,getter和setter已经成为了JavaScript的一部分。它们广泛支持所有的主流浏览器,甚至是IE8。

我不认为这个点子通常是错误的,但我认为它不是非常适合JavaScript。可能看起来getter和setter可以简化代码和节省时间,但其实它们会带来隐藏错误,并且这些错误***眼看并不明显。

getter和setter如何工作?

首先小小地总结一下这些是什么东西:

有时候,我们希望能允许访问一个会返回动态计算值的属性,或者你可能想要反映内部变量的状态,而不使用显式的方法调用。

为了说明它们是如何工作的,让我们来看一个有着两个属性的person对象,这两个属性为:firstName和lastName,以及一个计算值:fullName。

var obj = {    firstName: "Maks",    lastName: "Nemisj"  }

计算值fullName会返回firstName和lastName两者的串联。

Object.defineProperty(person, 'fullName', {    get: function () {      return this.firstName + ' ' + this.lastName;    }  });

为了得到fullName的计算值,不需要像person.fullName()带可怕的括号,只需要使用简单的var fullName =  person.fullName。

这同样适用于setter,你可以通过使用函数设置值:

Object.defineProperty(person, 'fullName', {    set: function (value) {      var names = value.split(' ');      this.firstName = names[0];      this.lastName = names[1];    }  });

使用就和getter一样简单:person.fullName = ‘Boris Gorbachev’。这将调用上面定义的函数,并分离Boris  Gorbachev成firstName和lastName。

问题在哪里?

你也许在想:“嘿,我喜欢getter和setter方法,它们感觉更自然,就像JSON一样。”你说得对,它们的确是这样的,但是我们先退一步来看一看fullName在getter和setter之前是如何工作的。

为得到值,我们将使用类似于getFullName()的一些东西,以及为了设置值,我们将使用person.setFullName(‘Maks  Nemisj’)。

如果拼错函数名,person.getFullName()写成person.getFulName()会发生什么呢?

JavaScript会给出一个错误:

person.getFulName();         ^  TypeError: undefined is not a function

这个错误会在适当的时候适当的地方被触发。访问函数不存在的对象将触发错误——这是好的。

现在,让我们来看看当用错误的名称来使用setter的时候会发生什么?

person.fulName = 'Boris Gorbachev';

什么也没有。对象是可扩展的,可以动态分配键和值,因此不会有错误在运行时被抛出。

这样的行为意味着错误可能显示在用户界面上的某个地方,或者,当某些操作被执行在错误的值上时,而并非是打字错误的时刻。

跟踪应该发生在过去但却显示在将来的代码流上的错误是如此有意思。

seal行不行

这个问题可以通过sealapi来部分解决。只要对象是密封的,它就不能突变,也就是意味着fulName将试图分配一个新键到person对象,并且它会失败。

出于某种原因,当我在node.js V4.0测试这个的时候,它没有按照我期待的那样工作。所以,我不能确保这个解决方案。

而更令人沮丧的是,对于setter一点也没有解决方法。正如我前面提到的,对象是可扩展和可故障保护的,这意味着访问一个不存在的键不会导致任何错误。

如果这种情况只适用于对象的文字的话,我不会多此一举地写这篇文章,但在ECMAScript  2015(es6)和用类定义getter和setter能力的兴起之后,我决定写下关于潜在陷阱的博客。

类的到来

我知道当前类在一些JavaScript社区不是非常受欢迎。人们对在函数式/基于原型的语言,例如JavaScript中是否需要它们,争执不休。然而,事实是,类就在ECMAScript  2015(ES6)规范说明中,并且将存在于此一段时间。

对我来说,类是指定在类的外部世界(消费者)和应用程序的内部世界之间的定义良好的API的一种方式。这就是白纸黑字放入规则的抽象,并且我们假定这些规则不会很快改变。

改进person对象,做一个它的real类。person定义了接口用于获取和设置fullName。

class Person {    constructor(firstName, lastName) {      this.firstName = firstName;      this.lastName = lastName;    }    getFullName() {      return this.firstName + ' ' + this.lastName;    }    setFullName(value) {      var names = value.split(' ');      this.firstName = names[0];      this.lastName = names[1];    }  }

类定义了一个严格的接口描述,但getter和setter方法使其变得不太严格。我们已经习惯了臃肿的错误,当工作于对象文字和jsON时的键中出现拼写错误的时候。我希望至少类能够更严格,并且在这个意义上,提供更好的反馈给开发人员。

虽然这种情况在定义getter和setter在一个类上的时候没有任何不同。但它不会阻止任何人拼错。

class Person {    constructor(firstName, lastName) {      this.firstName = firstName;      this.lastName = lastName;    }    get fullName() {      return this.firstName + ' ' + this.lastName;    }    set fullName(value) {      var names = value.split(' ');      this.firstName = names[0];      this.lastName = names[1];    }  }

有拼写错误的执行不会给出任何错误:

var person = new Person('Maks', 'Nemisj');  console.log(person.fulName);

同样不严格,不冗长,不可追踪的行为导致可能会出错。

在我发现这一点后,我有一个问题:在使用getter和setter的时候,有没有什么可以做的,以便于使得类更严格?我发现:有是肯定有,但是这值得吗?增加额外层次的复杂性到代码就只是为了使用数量更少的括号?对于API定义,也可以不使用getter和setter,而这样一来就能解决这个问题。除非你是一个铁杆开发人员,并愿意继续进行,不然还有另一种解决方案,如下所述。

proxy来帮助?

除了getter和setter方法,ECMAScript  2015(ES6)还自带proxy对象。proxy可以帮助你确定委托方法,这些委托方法可以在实际访问键执行之前,用来执行各种操作。事实上,它看起来像动态getter  / setter方法。

proxy对象可以用来捕捉任何到类的实例的访问,并且如果在类中没有找到预先定义的getter或setter就会抛出错误。

为了做到这一点,必须执行下面两个操作:

  • 创建基于Person原型的getter和setter清单。

  • 创建将测试这些清单的Proxy对象。

让我们来实现它。

首先,为了找出什么样的getter和setter方法可以用在类Person上,可以使用getOwnPropertyNames和getOwnPropertyDescriptor:

var names = Object.getOwnPropertyNames(Person.prototype);  var getters = names.filter((name) => {    var result =  Object.getOwnPropertyDescriptor(Person.prototype, name);    return !!result.get;  });  var setters = names.filter((name) => {    var result =  Object.getOwnPropertyDescriptor(Person.prototype, name);    return !!result.set;  });

在此之后,创建一个Proxy对象:

var handler = {    get(target, name) {      if (getters.indexOf(name) != -1) {        return target[name];      }      throw new Error('Getter "' + name + '" not found in "Person"');    },    set(target, name) {      if (setters.indexOf(name) != -1) {        return target[name];      }      throw new Error('Setter "' + name + '" not found in "Person"');    }  };  person = new Proxy(person, handler);

现在,只要你尝试访问person.fulName,就会显示Error: Getter “fulName” not found in  “Person”的消息。

希望这篇文章可以帮助你全面了解getter和setter方法,以及它们将会带到代码中的危险。

“JavaScript中使用getter和setter有什么不好”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: JavaScript中使用getter和setter有什么不好

本文链接: https://lsjlt.com/news/68457.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript中使用getter和setter有什么不好
    本篇内容介绍了“JavaScript中使用getter和setter有什么不好”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅...
    99+
    2024-04-02
  • JavaScript中getter与setter怎么使用
    JavaScript中的getter和setter是一种特殊的方法,用于获取和设置对象的属性值。以下是使用getter和setter...
    99+
    2023-09-22
    JavaScript
  • TypeScript中怎么使用getter和setter
    这篇文章主要介绍“TypeScript中怎么使用getter和setter”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“TypeScript中怎么使用getter和setter”文章能帮助大家解决问...
    99+
    2023-07-05
  • TypeScript 中使用 getter 和 setter的方法
    使用 get 和 set 关键字在 TypeScript 中定义 getter 和 setter。 getter 使我们能够将属性绑定到在访问属性时调用的函数,而 setter 将属...
    99+
    2023-05-14
    TypeScript 使用 getter 和 setter TypeScript  getter 和 setter
  • Python中的getter和setter的方法使用详解
    本文主要内容: 解释setter和getter的使用方法解释@property装饰器的妙用在python中,setter和getter方法并不像其它编程语言中的那样。基本上,在面向对...
    99+
    2022-12-08
    Python的getter和setter的方法使用 Python的getter和setter
  • 怎么在JavaScript中使用getters和setter
    这篇文章主要讲解了“怎么在JavaScript中使用getters和setter”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在JavaScript中使...
    99+
    2024-04-02
  • Vuex中的State和Getter有什么用
    这篇文章主要介绍Vuex中的State和Getter有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Vuex 的内脏由五部分组成:State、Getter、Mutation、Action 和 Module。本篇...
    99+
    2023-06-21
  • ajax和javascript有什么不同
    这篇文章给大家介绍ajax和javascript有什么不同,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript的特点1.JavaScript主要用来向HTML页面添加交互行为。2.JavaScript可以...
    99+
    2023-06-14
  • Java 和 JavaScript 有什么不同?
    Java 和 JavaScript 是两种编程语言,它们有着不同的用途和特点。本文将深入探讨 Java 和 JavaScript 的不同之处,帮助你更好地理解这两种语言。 Java 是一种面向对象的编程语言,最初由 Sun Microsys...
    99+
    2023-06-28
    文件 javascript numpy
  • Java和JavaScript:有什么不同?
    Java和JavaScript这两个名字看似相似,但实际上它们是完全不同的编程语言。在本文中,我们将探讨Java和JavaScript的不同之处。 Java和JavaScript的起源 Java是由Sun Microsystems公司...
    99+
    2023-09-10
    javascript shell linux
  • JavaScript 中什么时候使用 Map 更好
    目录Map 用作 Hash Map性能基准测试的实现细节字符串类型的键整数类型的键数值类型的键内存使用总结浏览器兼容性笔记Map 用作 Hash Map ES6 给我们带来了&nbs...
    99+
    2024-04-02
  • JavaScript中进程和线程有什么不同
    JavaScript中进程和线程有什么不同?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。区别:进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响;而线...
    99+
    2023-06-15
  • javascript中 “ && ” 和 “ || ”有什么用
    小编给大家分享一下javascript中 “ && ” 和 “ || ”有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、原理:&& 操作符特点:逻...
    99+
    2024-04-02
  • JavaScript中splice()和slice()有什么用
    这篇文章主要介绍了JavaScript中splice()和slice()有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1 splic...
    99+
    2024-04-02
  • javascript中max和min有什么用
    这篇文章主要为大家展示了“javascript中max和min有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中max和min有什么用...
    99+
    2024-04-02
  • JavaScript中的useRef 和 useState有什么用
    小编给大家分享一下JavaScript中的useRef 和 useState有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、useS...
    99+
    2023-06-21
  • javascript中的offsetWidth和clientWidth有什么用
    offsetWidth和clientWidth都是用于获取元素的宽度的属性。 offsetWidth: 获取元素的整体宽度,包括...
    99+
    2024-03-08
    javascript
  • JavaScript中有什么不同版本
    这篇文章将为大家详细讲解有关JavaScript中有什么不同版本,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。js版本有:1.0、1.1、1.2、1.3、1.4、1.5、1.6、1.7、1.8、1.8.1...
    99+
    2023-06-15
  • JavaScript中find()和findIndex()方法有什么用
    小编给大家分享一下JavaScript中find()和findIndex()方法有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一...
    99+
    2024-04-02
  • Java和JavaScript有什么相同点和不同点?
    Java和JavaScript是两种非常常见的编程语言,它们在开发应用程序和网站方面都有着广泛的应用。虽然它们的名字很相似,但它们有着不同的用途和特点。本文将探讨Java和JavaScript之间的相同点和不同点。 一、相同点 编程语言 ...
    99+
    2023-08-26
    javascript 数据类型 关键字
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作