由于私有变量这个概念在JS里可能指的是函数内部局部变量,或者是文件级的未export变量,看了一下题目中的标签上有OOP,大概明白楼主问的是类似java和php那种类内部私有变量。 首先要纠正的是,楼主提到的这两个OOP名词:OOP下的私有变量和静态私有变量,在当前的JS下是没有的,虽然可以用原型链包装成类似的概念。 并且JS里的类,实际上和java、php这些OOP语言的类很不相同,它是一个原型链继承的实现。ES2015所加的class关键字也只是一个语法糖。 私有变量目前不在ES规范里,目前有一个提案ECMAScript Private Fields 还在stage1的阶段,不过可以参考一下。 静态变量也不在ES规范里,目前有一个提案Public Class Fields 已经处于stage2的阶段,有很大希望进入ES2017规范里,不过要注意它是public class fields的提案。 以上是JS的现状,再回答一下楼主,区别很简单,就是私有变量是每个实例都独立的,而静态私有变量是共用的,比如我们可以设计这么一个类(用的是草案上的语法) class Test{ #a; // 私有变量 static #count; // 静态私有变量 constructor(a = 0) { this.#a = +a; #count++; } get a() { return this.#a } set a(value) { this.#a = +value } static get count(){ return #count; } } 可以看到这两个变量都已经被封装,外部无法访问,只能通过另外一个方法来代理访问,但是count变量是所有类实例共用的,这样我们可以统计出这个类到底创建了多少个实例。 这和其它OOP语言的概念都是一致的。
由于私有变量这个概念在JS里可能指的是函数内部局部变量,或者是文件级的未export变量,看了一下题目中的标签上有OOP,大概明白楼主问的是类似java和php那种类内部私有变量。
首先要纠正的是,楼主提到的这两个OOP名词:OOP下的私有变量和静态私有变量,在当前的JS下是没有的,虽然可以用原型链包装成类似的概念。
并且JS里的类,实际上和java、php这些OOP语言的类很不相同,它是一个原型链继承的实现。ES2015所加的class关键字也只是一个语法糖。
私有变量目前不在ES规范里,目前有一个提案ECMAScript Private Fields 还在stage1的阶段,不过可以参考一下。
静态变量也不在ES规范里,目前有一个提案Public Class Fields 已经处于stage2的阶段,有很大希望进入ES2017规范里,不过要注意它是public class fields的提案。
以上是JS的现状,再回答一下楼主,区别很简单,就是私有变量是每个实例都独立的,而静态私有变量是共用的,比如我们可以设计这么一个类(用的是草案上的语法)
可以看到这两个变量都已经被封装,外部无法访问,只能通过另外一个方法来代理访问,但是count变量是所有类实例共用的,这样我们可以统计出这个类到底创建了多少个实例。
这和其它OOP语言的概念都是一致的。