这说明了,peter,tom都是一个类的实例化对象,共享这一个类的所有属性和方法。
根据原型共享,如果在一个实例对象上更改原型上的值,会直接影响到其他实例,所以一般不建议使用这种方式更改原型的值。
因此最好不要通过实例去更改类的值。
this的指向 (不懂)类的方法内部如果含有this,它默认指向类的实例,如果单独提取该方法调用this会报错
class Print{ printName(name){ this.print(name); } print(text){ alert(text); } } var hello = new Print(); var {printName} = hello; //对象的解构,printName == hello.printName,为何找不到this的指向? printName('peter'); // Cannot read property 'print' of undefined解决办法:
1 在constructor方法中绑定this。
2 使用箭头函数。
printName(name)=>{this.print(name)};
3 使用proxy(待学习)
所谓的私有方法和私有属性,只能在类中供其他方法使用。 有两种方式可以声明私有方法和私有属性
1 将要调用的方法放到类的外部,在类的内部,通过call,apply进行调用。
javascript class Print{
printName(name){
print.call(this,name);
} } function print(text){alert(text)} var hello = new Print(); hello.printName('peter'); // peter
这种方式是把私有方法放到外部,不能被调用,这意思是说的在类的内部是访问不到print方法的。
2 使用sybmol类型。
symbol类型保证了是独一无二的,导致第三方获取不到,达到了私有的效果。
class的取值函数和存值函数与 ES5 一样,在“类”的内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
class Person{ constructor(){ } get height(){ return this._height } set height(value){ this._height = value } } var peter = new Person(); peter.height = 12344; // 设置身高 console.log(perter.height) // 12344当一个属性只有get没有set的时候,我们是无法进行赋值操作的,第一次初始化也不行。 如果把变量定义为私有的(定义在类的外面),就可以只使用get不使用set。
Class 的 Generator在类的某个方法的前面加上星号,可以代表这是个generator函数。可以用generator的方式去运用这个方法。
class Person{ *sum(x,y,z){ yield x + y; yield y + z; yield x + y +z; } } var a = new Person(); for(let i of a.sum(1,2,3)){ console.log(i); } // 3 5 6 class的静态方法类相当于实例的原型,所有在类中定义的方法,都会被实例继承。 如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
class Person{ static print(text){ alert(text); } printName(name){ this.print(name); } } Person.print('peter') // peter var peter = new Person(); peter.print('peter'); // peter.print is not a function上面的代码表示:可以直接在Person类上调用(Person.print('peter')),而不是在Person类的实例上调用。如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。
如果静态方法包含this关键字,这个this指的是类,而不是实例。
静态方法可以与非静态方法重名。(就是static的方法是一个,非static的方法是一个,两者无关联)。
父类的静态方法,可以被子类继承。
new是从构造函数生成实例对象的命令 ES6 为new命令引入了一个new.target属性,该属性一般用在构造函数之中,返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,new.target会返回undefined,因此这个属性可以用来确定构造函数是怎么调用的。
function Person(name) { if (new.target === Person) { this.name = name; } else { throw new Error('必须使用 new 命令生成实例'); } } var peter = new Person('peter'); var notAPerson = Person.call(peter, 'peter'); // 报错 必须使用 new 命令生成实例Class 内部调用new.target,返回当前 Class。
子类继承父类时,new.target会返回子类。
用处:可以写出不能独立使用、必须继承后才能使用的类。