JavaScript 进阶实战课
石川
JavaScript Patterns and Anti-Patterns 等开源项目创建者,O'Reilly 技术评审
15066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
JavaScript 进阶实战课
15
15
1.0x
00:00/00:00
登录|注册

07 | 深入理解对象的私有和静态属性

你好,我是石川。
在前面几讲里,我们围绕着函数式编程,从基础的输入、计算、输出讲起,到过程中可能产生的副作用,再到如何通过纯函数和不可变作为解决思路来管理副作用等等,都有了系统的了解。之后,我们又通过响应式编程和函数式编程的结合,了解了这种模式下面,如何面对未知以及基于事件变化做出响应。
从这节课开始,我们再来深入了解下 JavaScript 的对象构建和面向对象的编程模式
第 1 讲里,我们第一次介绍到了对象和面向对象。对象其实就好比一个人,生来都是带有属性和功能的,比如肤色、身高等等就是我们的属性,会哭会笑这些就是我们的功能。我们作为对象和别的对象之间要产生交互,这就是面向对象的设计。那今天我们就从一个对象的创建讲起。
在面向对象的设计中,一个对象的属性是至关重要的,因为它也决定了对象是什么、能做什么。一个对象可以有对外分享的、别人可以获取的公开属性,也有不对外暴露的、别人不可以随便获取的私有属性
除了公开和私有属性,还有静态属性。静态属性是属于类,而不是单独属于对象的。这么解释听上去可能有些绕口,我们可以打个比方,比如说中国有 14 亿人口,那么“14 亿人口”就是属于中国这个国家类的属性,但是我们不能说具体每一个中国人具有“14 亿人口”这个属性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript中的对象构建和面向对象编程模式是开发中的重要主题。本文深入探讨了对象的私有和静态属性的创建方法。首先介绍了私有属性的概念和创建方式,包括使用最新规范中的#符号、闭包和IIFE、WeakMap以及Symbol等方法。这些方法为开发者提供了多种选择,以确保对象的私有属性不被外部访问。其次,文章详细讨论了静态属性的创建方式,强调了静态属性属于构造函数而非对象实例。通过示例代码和解释,读者可以清晰地了解如何在JavaScript中实现静态属性。整体而言,本文内容深入浅出,为读者提供了全面的对象属性管理知识。 在文章中,我们深入探讨了JavaScript中对象的私有和静态属性的创建方法。首先介绍了私有属性的概念和创建方式,包括使用最新规范中的#符号、闭包和IIFE、WeakMap以及Symbol等方法。这些方法为开发者提供了多种选择,以确保对象的私有属性不被外部访问。其次,文章详细讨论了静态属性的创建方式,强调了静态属性属于构造函数而非对象实例。通过示例代码和解释,读者可以清晰地了解如何在JavaScript中实现静态属性。整体而言,本文内容深入浅出,为读者提供了全面的对象属性管理知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 进阶实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 西红柿炒番茄
    weekmap、symbol实现静态属性,应该也是利用了闭包的特性吧?因为都是在创建的函数中保存了外部存储的数据

    作者回复: 好问题,它们和闭包是不同的。闭包主要利用的是内层函数对外层函数内变量的访问。symbol主要是利用了唯一值的特点,实现私有属性。 而用weakmap,可以对属性存储,避免了用this对属性的获取。并且和map相比,它只能用对象作为键名,键值会随着对象销毁。这样可以避免不同对象用同一个map时之间相互的影响;以及对象销毁了后,map依然存在的问题。

    2022-10-12归属地:北京
    5
    1
  • 靜態公開屬性或方法的話可以這樣實現: class A{} A.a = 1 A.b = function(){} 私有的靜態方法不知道怎麼實現

    作者回复: 可以参考MDN里介绍的“私有静态方法”:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields class ClassWithPrivateStaticMethod { static #privateStaticMethod() { return 42; } static publicStaticMethod1() { return ClassWithPrivateStaticMethod.#privateStaticMethod(); } static publicStaticMethod2() { return this.#privateStaticMethod(); } } console.log(ClassWithPrivateStaticMethod.publicStaticMethod1() === 42); // true console.log(ClassWithPrivateStaticMethod.publicStaticMethod2() === 42); // true

    2022-10-04归属地:北京
    2
    1
  • 褚琛
    //闭包创建私有静态私有属性 var WidgetN; (function () { var appName = '天气应用'; WidgetN = function() {}; WidgetN.staticGetName = function() { return appName; } })() console.log(WidgetN.staticGetName()); console.log(WidgetN.appName); //Symbol创建静态私有属性 var WidgetP; { let staticPrivateProps = Symbol(); WidgetP = function() {}; WidgetP[staticPrivateProps] = { appName: '天气应用' }; WidgetP.staticGetName = function() { return WidgetP[staticPrivateProps].appName; } } console.log(WidgetP.staticGetName()); console.log(WidgetP.appName);
    2022-10-08归属地:海南
    2
  • Nuvole Bianche
    原文:“在下面的例子中,我们首先声明了一个 WidgetG 变量。接下来,建立一个块级作用域,在这个作用域里,我们再声明一个 privateProps 的 WeakMap 变量。然后我们给 WidgetG 赋值一个函数声明,在里面给 WeakMap 的键名设置为 this,键值里面的 appName 为“天气应用”。下一步,我们基于 WidgetF 的 prototype 来创建一个 getName 方法,里面返回了 appName 的值。” 其中的WidgetG 在示例代码中用的是WidgetH吧
    2023-03-24归属地:上海
  • Nuvole Bianche
    原文: 这时候,我们通过函数构造可以创建一个新的函数 widget6, 应该是新的对象widget6吧。
    2023-03-24归属地:上海
  • 哎呦先生
    私有属性无法通过对象实例直接操作,需要对象暴露方法来操作具体属性。java中一般用get和set方法来进行私有属性的获取和操作属性。静态属性是属于类的属性,不是某个类的实例属性。例如你可以说人类有五千年的文明,但是不能说某个人有五千年的文明。文明这个属性,是属于人类而不是具体某个人。
    2022-11-04归属地:北京
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部