返回顶部
首页 > 资讯 > 精选 >JavaScript 中怎样创建私有成员
  • 819
分享到

JavaScript 中怎样创建私有成员

2023-06-22 01:06:39 819人浏览 泡泡鱼
摘要

javascript 中怎样创建私有成员,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言:面向对象编程语言中的 private 关键字是一个访问修饰符,可用于使属性

javascript 中怎样创建私有成员,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

前言:

面向对象编程语言中的 private 关键字是一个访问修饰符,可用于使属性和方法只能在声明的类中访问。这使得隐藏底层逻辑变得容易,这些底层逻辑应该被隐藏起来,并且不应该与类的外部交互。

但是如何在 JavaScript 中实现类似的功能呢? 没有保留关键字 private ,但在新的标准中 JavaScript 有自己的方法来创建类私有成员,但目前还处于 ES2020 试验草案中,并且语法比较奇怪,以 # 作为前缀。下面介绍几种在 JavaScript 代码中实现私有属性和方法的方式。

1.使用闭包

使用闭包可以使用私有属性或者方法的封装。利用闭包可以访问外部函数的变量特征。

如下代码片段:

function MyProfile() {    const myTitle = "DevPoint";    return {        getTitle: function () {            return myTitle;        },    };}const myProfile = MyProfile();console.log(myProfile.getTitle()); // DevPoint

这可以转化为将最顶层的自调用函数调用分配给一个变量,并且只用函数返回来公开它的一些内部函数:

const ButtonCreator = (function () {    const properties = {        width: 100,        height: 50,    };    const getWidth = () => properties.width;    const getHeight = () => properties.height;    const setWidth = (width) => (properties.width = width);    const setHeight = (height) => (properties.height = height);    return function (width, height) {        properties.width = width;        properties.height = height;        return {            getWidth,            getHeight,            setWidth,            setHeight,        };    };})();const button = new ButtonCreator(600, 360);console.log(button.getHeight()); // 360

2.使用 es6

为了使代码更类似于 OOP 方法,可以使用 ES6 中引入的 class 关键字。要使属性和方法私有,可以在类之外定义它们。

就对上面的 ButtonCreator 的例子使用 class 进行重构:

const properties = {    width: 100,    height: 50,};class ButtonCreator {    constructor(width, height) {        properties.width = width;        properties.height = height;    }    getWidth = () => properties.width;    getHeight = () => properties.height;    setWidth = (width) => (properties.width = width);    setHeight = (height) => (properties.height = height);}const button = new ButtonCreator(600, 360);console.log(button.getHeight()); // 360

现在假设属性是公共的,但想在私有方法中使用它们,其中上下文指向 ButtonCreator,可以通过以下方式实现它:

const privates = {    calculateWidth() {        return this.width;    },};class ButtonCreator {    constructor(width, height) {        this.width = width;        this.height = height;    }    getWidth = () => privates.calculateWidth.call(this);    getHeight = () => this.height;    setWidth = (width) => (this.width = width);    setHeight = (height) => (this.height = height);}const button = new ButtonCreator(600, 360);console.log(button.getHeight()); // 360

上面的代码使用了 Function.prototype.call,它用于调用具有给定上下文的函数。在例子中,使用 ButtonCreator 类的上下文。

如果私有函数也需要参数,可以将它们作为附加参数传递以调用:

const privates = {    calculateWidth(percent) {        return this.width * percent;    },};class ButtonCreator {    constructor(width, height) {        this.width = width;        this.height = height;    }    getWidth = () => privates.calculateWidth.call(this, 0.1);    getHeight = () => this.height;    setWidth = (width) => (this.width = width);    setHeight = (height) => (this.height = height);}const button = new ButtonCreator(600, 360);console.log(button.getWidth()); // 60

3.使用 ES2020 提案

还处于 ES2020 试验草案中,引入了私有方法或者属性的定义,语法比较奇怪,以 # 作为前缀。

class ButtonCreator {    #width;    #height;    constructor(width, height) {        this.#width = width;        this.#height = height;    }    // 私有方法    #calculateWidth() {        return this.#width;    }    getWidth = () => this.#calculateWidth();    getHeight = () => this.#height;    setWidth = (width) => (this.#width = width);    setHeight = (height) => (this.#height = height);}const button = new ButtonCreator(600, 360);console.log(button.width); // undefinedconsole.log(button.getWidth()); // 600

4.使用 WeakMap

这种方法建立在闭包方法之上,使用作用域变量方法创建一个私有 WeakMap,然后使用该 WeakMap 检索与此相关的私有数据。这比作用域变量方法更快,因为所有实例都可以共享一个 WeakMap,所以不需要每次创建实例时都重新创建方法。

const ButtonCreator = (function () {    const privateProps = new WeakMap();    class ButtonCreator {        constructor(width, height, name) {            this.name = name; // 公共属性            privateProps.set(this, {                width, // 私有属性                height, // 私有属性                calculateWidth: () => privateProps.get(this).width, // 私有方法            });        }        getWidth = () => privateProps.get(this).calculateWidth();        getHeight = () => privateProps.get(this).height;    }    return ButtonCreator;})();const button = new ButtonCreator(600, 360);console.log(button.width); // undefinedconsole.log(button.getWidth()); // 600

这种方式对于私有方法的使用有点别扭。

5.使用 typescript

可以将 TypeScript 用作 JavaScript 的一种风格,可以使用 private 关键字从面向对象的语言中真正重新创建功能。

class ButtonCreator {    private width: number;    private height: number;    constructor(width: number, height: number) {        this.width = width;        this.height = height;    }    private calculateWidth() {        return this.width;    }    public getWidth() {        return this.calculateWidth();    }    public getHeight() {        return this.height;    }}const button = new ButtonCreator(600, 360);console.log(button.getWidth()); // 600console.log(button.width); // error TS2341: Property 'width' is private and only accessible within class 'ButtonCreator'.

看完上述内容,你们掌握JavaScript 中怎样创建私有成员的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: JavaScript 中怎样创建私有成员

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

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

猜你喜欢
  • JavaScript 中怎样创建私有成员
    JavaScript 中怎样创建私有成员,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言:面向对象编程语言中的 private 关键字是一个访问修饰符,可用于使属性...
    99+
    2023-06-22
  • JavaScript 中创建私有成员
    目录1.使用闭包2.使用 ES6 类3.使用 ES2020 提案4.使用 WeakMap5.使用 TypeScript前言: 面向对象编程语言中的 private 关键字是一个访问修...
    99+
    2024-04-02
  • Javascript中怎么实现一个私有成员
    这篇文章给大家介绍Javascript中怎么实现一个私有成员,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Javascript中闭包的特性,从而彻底解决了Javascript私有成员的...
    99+
    2024-04-02
  • JavaScript 对象中怎么嵌入私有成员
    JavaScript 对象中怎么嵌入私有成员,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 为何要用私有成员(Private Memb...
    99+
    2024-04-02
  • JavaScript中私有成员的作用是什么
    这期内容当中小编将会给大家带来有关JavaScript中私有成员的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。class BaseView ...
    99+
    2024-04-02
  • Javascript中的私有成员是什么意思
    这篇文章主要介绍“Javascript中的私有成员是什么意思”,在日常操作中,相信很多人在Javascript中的私有成员是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • C#中怎么访问私有成员
    这期内容当中小编将会给大家带来有关C#中怎么访问私有成员,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存在很多私有...
    99+
    2023-06-17
  • VB.NET中怎么创建共享成员变量
    这期内容当中小编将会给大家带来有关VB.NET中怎么创建共享成员变量,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在某些时候,可能需要在各个对象之间共享某个成员变量(当一个对象向变量赋值时,每个对象都可以...
    99+
    2023-06-17
  • 改变C++中私有变量成员的值
    没有引用的情况: #include #include using namespace std;class Person{public: queueque;public: queue getQueue() { ...
    99+
    2023-09-08
    c++ 算法 开发语言
  • python封装中私有成员指的是什么
    这篇文章将为大家详细讲解有关python封装中私有成员指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题...
    99+
    2023-06-14
  • JavaScript怎样创建字符串数组
    这篇“JavaScript怎样创建字符串数组”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“JavaScript怎样创建字符串数组”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解...
    99+
    2023-06-06
  • JavaScript中怎么动态创建div属性和样式
    JavaScript中怎么动态创建div属性和样式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.创建div元素:Javascript代...
    99+
    2024-04-02
  • 怎样在SQLServer中创建表
    在SQL Server中创建表,可以通过以下步骤实现: 打开SQL Server Management Studio(SSMS)并...
    99+
    2024-04-09
    SQLServer
  • JavaScript中怎么创建对象
    小编给大家分享一下JavaScript中怎么创建对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ECMA-262把对象定义为:...
    99+
    2024-04-02
  • javascript中怎么创建数组
    这篇文章将为大家详细讲解有关javascript中怎么创建数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在js中,可以使用array方法创建数组,具体方法为:1、通过构造函数创建数组,语法格式为“le...
    99+
    2023-06-15
  • oracle中怎样创建表空间
    oracle中怎样创建表空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  ORACLE EBS操作某一个FORM界面,或者后台数据库操作某...
    99+
    2024-04-02
  • 怎样在SQLServer中创建索引
    在SQL Server中,可以使用CREATE INDEX语句来创建索引。以下是创建索引的一般步骤: 确定要在哪个表上创建索引。 ...
    99+
    2024-04-09
    SQLServer
  • 怎样在MySQL中创建表格
    要在MySQL中创建表格,可以使用CREATE TABLE语句。以下是一个简单的示例: CREATE TABLE users ( ...
    99+
    2024-04-09
    MySQL
  • 怎样创建与框架无关的JavaScript插件
    怎样创建与框架无关的JavaScript插件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript中的插件使我们能够扩展语言,...
    99+
    2024-04-02
  • 怎么在javascript中定义私有方法
    怎么在javascript中定义私有方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝大多...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作