js的实例,原型和类成员
类语法可以非常方便的定义应该存在于实例上的成员,应存在于原型上的成员,以及应该存在于类本身的成员
1.实例方法
每次执行new调用类标识符时,都会执行类构造函数。在这个函数内部,可以为新创建的实例(this)添加自有属性。另外在构造函数执行完之后,仍可以给实例继续添加新成员
每个实例都对应唯一一个成员,这意味着所有成员都不会在原型上共享
class Preson{ constructor(){ this.name=new String('Jack')' this.sayName=()=>{console.log(this.name)}; this.nickNames=['jake','jdog'] } } let p1=new Person() p2=new Person(); p1.sayName(); p2.sayName(); console.log(p1.name===p2.name); console.log(p1.sayName===p2.sayName); console.log(p1.nickNames===p2.nickNames); p1.name=p1.nickNames[0]; p2.name=p2.nickName[1]; p1.sayName(); p2.sayName();
2.原型方法和访问器
为了实现在实例间共享方法,类定义语法把在类块中定义的方法作为原型方法
class Person{ constructor(){ this.locate=()=>console.log('instance'); } locate(){ console.log('prototype'); } } let p=new Person(); p.locate();//instance Person.protorype.locate();//prototype
可以将方法定义在类构造函数中或者类块中,但不能在类块中给原型添加原始值或对象作为成员数据
class Person{ name:'jack' } //Uncaught SyntaxError:Unexpected token;
类定义也支持获取和设置访问器,语法和行为与普通对象一样
class Person{
    set name(newName){
      this.name_=newName;
  }
   get name(){
            return this.name_;
  }
}
let p=new Person();
p.name='jake';
console.log(p.name);//jake
3.静态类方法
可以在类上定义静态方法。这些方法通常用于执行不特定于实例的操作,也不要求存在类的实例。
class Person{ constructor(){ //添加在this上的所有内容都会存在在不同的实例上 this.locate=()=>console.log('instance'); } locate(){ //定义在类的原型对象上 console.log('prototype'); } static locate(){ //定义在类本身上 console.log('prototype',this); } } let p=new Person() p.locate(); Person.prototype.locate(); Person.locate();
4.非函数原型和类成员
虽然类定义并不显式支持在原型或类上添加成员数据,但在类定义外部,可以手动添加
class Person{ sayName(){ console.log( `${Preson.greeting${this.name}}` )}}; //在类上定义数据成员 Person.greeting='My name is'; //在原型上定义数据成员 Person.prototype.name='Jakc'; let p=new Person(); p.sayName();
5.迭代器和生成器方法
类定义语法支持在原型和类本身生定义生成器方法
class Person{ //在原型上定义生成器方法 *createNickNameIterator(){ yield 'Jack'; yield' Jake'; yield ' jdog' } //在类上定义生成器方法 static *createNickNameIterator(){ yield 'Jack'; yield' Jake'; yield ' jdog' } } let p=Person.createNickNameIterator(); console.log(p.next()/value); console.log(p.next()/value); console.log(p.next()/value); let p2=new Person(); let p3=p2.createNickNameIterator(); console.log(p2.next()/value); console.log(p2.next()/value); console.log(p2.next()/value);
总结:
类中定义的方法为原型上的方法,这些方法的引用是相同的。类中定义的构造函数中,赋值给this的方法,为类实例的方法,这些方法的引用是不同的。类中定义的静态方法为类上的方法
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号