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的方法,为类实例的方法,这些方法的引用是不同的。类中定义的静态方法为类上的方法

 

posted @ 2025-08-10 19:25  白头吟  阅读(43)  评论(0)    收藏  举报