js中,到底什么是私有属性
发布于 6 年前 作者 Arthur-lt 5874 次浏览 来自 问答

function A(name){this.name=name; var hello=‘world’}。 到底this.name= name是私有属性,还是hello=world是私有属性。以及私有属性能不能被继承

10 回复

js其实没有私有属性,这只是利用js作用域的一个trick

来自酷炫的 CNodeMD

@Lynskylate 可是书上老提私有属性,而且面试也问,不知道不行啊

这些都不是私有属性,私有属性是class A { #a = 1; }这样写的

想要了解私有属性你需要了解一个典型的面向对象语言.

与 private 私有属性对应的是 public 公开属性, protected 受保护属性.

  • private 私有类成员, 只能在类内部访问, 不能被继承, 不能被子类/实例访问. 想要让私有类成员能够在外部获取到, 可以通过类的内部定义一个 公开的 (public) 函数来返回 (return) 这个类成员. 这样的话这个类成员可以被用户间接地访问到, 但是它无法被修改.

  • protected 受保护的类成员, 可以被自身和其子类访问, 可以被子类继承, 不能被实例化对象访问. 同样地, 可以在类的内部通过一个公开的函数来返回这个类成员, 来实现只可访问不可修改的限制.

JS 中并没有类, 也没有 private/protected 关键字. js 中的 ‘私有属性’ 其实是指某个作用域中无法被外部访问到的属性.

例如在 nodejs 中, 一个模块内部的模块级变量就是 ‘私有’ 的, 无法被外部访问. 一个立即执行函数内部的变量也是 ‘私有’ 的. 通过闭包, 也可以实现类似的 ‘私有’ 属性的访问.

阮一峰es6教程里有说明:私有方法和私有属性 你也可以借助Ts来说明:https://www.tslang.cn/docs/handbook/classes.html

https://github.com/tc39/proposal-class-fields#private-fields

class Counter extends HTMLElement {
  #x = 0;

  clicked() {
    this.#x++;
    window.requestAnimationFrame(this.render.bind(this));
  }

  constructor() {
    super();
    this.onclick = this.clicked.bind(this);
  }

  connectedCallback() { this.render(); }

  render() {
    this.textContent = this.#x.toString();
  }
}
window.customElements.define('num-counter', Counter);

@justjavac 这个提案es2019能进标准吗?😉😉

来自酷炫的 CNodeMD

@justjavac 要是真用上了#,我就对js无感了,全部换ts

@fruit-memory ts 并不是一门语言,作为 js 的超集,当 private-fields 进入标准后 ts 也会修改语法的

@Lynskylate 虽然已经 stage 3 了,但是应该进不了。

当目前为止,已经可以确定会进入 2019 的有 optional-catch-bindingproposal-json-superset

我猜有潜力进入的还有 Function.prototype.toString revision、BigInt、dynamic-import、Array.prototype.{flat,flatMap} 和 String.prototype.{trimStart,trimEnd}

回到顶部