• 西红柿炒番茄
    2022-10-12 来自北京
    weekmap、symbol实现静态属性,应该也是利用了闭包的特性吧?因为都是在创建的函数中保存了外部存储的数据

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

    共 5 条评论
    1
  • 鐘
    2022-10-04 来自北京
    靜態公開屬性或方法的話可以這樣實現: 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

    共 2 条评论
    1
  • 褚琛
    2022-10-08 来自海南
    //闭包创建私有静态私有属性 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);
    
    2
  • Nuvole Bianche
    2023-03-24 来自上海
    原文:“在下面的例子中,我们首先声明了一个 WidgetG 变量。接下来,建立一个块级作用域,在这个作用域里,我们再声明一个 privateProps 的 WeakMap 变量。然后我们给 WidgetG 赋值一个函数声明,在里面给 WeakMap 的键名设置为 this,键值里面的 appName 为“天气应用”。下一步,我们基于 WidgetF 的 prototype 来创建一个 getName 方法,里面返回了 appName 的值。” 其中的WidgetG 在示例代码中用的是WidgetH吧
    
    
  • Nuvole Bianche
    2023-03-24 来自上海
    原文: 这时候,我们通过函数构造可以创建一个新的函数 widget6, 应该是新的对象widget6吧。
    
    
  • 哎呦先生
    2022-11-04 来自北京
    私有属性无法通过对象实例直接操作,需要对象暴露方法来操作具体属性。java中一般用get和set方法来进行私有属性的获取和操作属性。静态属性是属于类的属性,不是某个类的实例属性。例如你可以说人类有五千年的文明,但是不能说某个人有五千年的文明。文明这个属性,是属于人类而不是具体某个人。
    
    