- class Foo {
- static classMethod() {
- return'hello';
- }
- }
- Foo.classMethod() // 'hello'
- var foo = new Foo();
- foo.classMethod()
- // TypeError: undefined is not a function
- ```javascript
- 父类的静态方法,可以被子类继承。
- ES6为new命令引入了一个`new.target`属性,(在构造函数中)返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,`new.target`会返回undefined,因此这个属性可以用来确定构造函数是怎么调用的。
- 需要注意的是,子类继承父类时,`new.target`会返回子类。
- 利用这个特点,可以写出不能独立使用、必须继承后才能使用的类。
- ```javascript
- classShape {
- constructor() {
- if (new.target === Shape) {
- throw new Error('本类不能实例化');
- }
- }
- }
- ```javascript
- ### 共享变量
- 在构造函数原型上定义的属性可以被所有实例共享。
- ### 静态变量
- ES6加入了static关键字。
- 构造函数原型链上定义的变量或属性只能通过构造函数访问,也可以当做是静态的。
- ### 私有变量
- 严格来讲,JavaScript 中没有私有成员的概念;所有对象属性都是公有的。不过,倒是有一个私有变量的概念。任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。私有变量包括函数的参数、局部变量和在函数内部定义的其他函数。
- 我们把有权访问私有变量和私有函数的公有方法称为特权方法(privileged method)。有两种在对象上创建特权方法的方式。第一种是在构造函数中定义特权方法
- ```javascript
- function MyObject(){
- //私有变量和私有函数
- var privateVariable = 10;
- functionprivateFunction(){
- returnfalse;
- }
- //特权方法
- this.publicMethod = function(){
- privateVariable++;
- return privateFunction();
- };
- }
来源: http://www.bubuko.com/infodetail-1965620.html