function A(name){this.name=name; var hello=‘world’}。 到底this.name= name是私有属性,还是hello=world是私有属性。以及私有属性能不能被继承
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-binding 和 proposal-json-superset
我猜有潜力进入的还有 Function.prototype.toString revision、BigInt、dynamic-import、Array.prototype.{flat,flatMap} 和 String.prototype.{trimStart,trimEnd}