详解JavaScript中的类

详解JavaScript类

类和对象

  1. 认识类前,首先我们先了解一下对象。所谓对象,实质上就是一个具体的事物在Javascript语言中的表现形式。比如对象可以是一只猫,猫具有它的特征:颜色、种类、体重等,也能做一些事情:奔跑、喵喵叫、爬树等。它的这些特征就叫做猫对象的属性,行为就是猫对象的方法。

    对象往往用名词来表示,如:Bood, Person
    属性一般用形容词表示
    方法一般用动词表示,如:speak, run

  2. 相似的对象之间往往有很多共同的特征。比如老虎和狮子都具有动物的特征,因此它们可以被统称为动物类。“ 对象 ” 这个词我们有时候也可以叫 “ 实例 ”,所以我们可以认为,老虎和狮子都是动物类的实例。我们能基于相同的类创建出许多不同的对象。类就像是一种模板,而对象就是在这些模板的基础上被创建出来的。

类的声明

  1. 构造函数方法(必须掌握)

    function Person1(name, sex){
          this.name = name;
          this.sex = sex;
    }
    Person1.prototype.job = function(){}
    let p1 = new Person1('lili', 'gril');
    
  2. ES6中的class声明

    class Person2 {
        constructor(name, sex){
            this.name = name;
            this.sex = sex;
        }
        job(){};
    }
    let p2 = new Person2('ming', 'boy');
    

类的继承

  • 原型链继承

    function Person(name,sex){
        this.name = name;
        this.sex = sex;
    }
    Person.prototype.job = function(){};
    function Teacher(selery){
        this.selery = selery;
    }
    Teacher.prototype = new Person('lili', 'girl');
    Teacher.prototype.constructor = Teacher;
    
    let t = new Teacher(5000);
    

    ​ 这种继承法是并不可用,因为子类无法设置继承父类的属性,只能在重新设置对象原型时设置一次,而且如果父类中的属性有对象或数组时,修改子类的属性会使其他子类的属性也改变。

  • 构造函数继承

    function Person(name,sex){
        this.name = name;
        this.sex = sex;
    }
    Person.prototype.job = function(){};
    
    function Teacher(name, sex, selery){
        Person.call(this, name, sex, selery);
        this.selery = selery;
    }
    
    let t = new Teacher('lili', 'girl', 5000);
    

    ​ 构造函数继承可以解决原型继承中无法设置继承父类的属性问题,但构造函数又有一个新问题,不能继承父类对象原型的方法。

  • 构造函数+原型链组合继承

    function Person(name,sex){
        this.name = name;
        this.sex = sex;
    }
    Person.prototype.job = function(){};
    
    function Teacher(name, sex, selery){
        Person.call(this, name, sex, selery);
        this.selery = selery;
    }
    
    // Teacher.prototype = new Person;	// 1. 多次继承了父类的属性
    // Teacher.prototype = Person.prototype;  // 2. 当子类型增加自己特有的方法时,父元素也会添加
    
      // 3. 使用Object.create创建一个Person原型对象,可避免上述问题
    Teacher.prototype = Object.create(Person.prototype);	 
    Teacher.prototype.constructor = Teacher;
    
    let t = new Teacher('lili', 'girl', 5000);
    

    ​ 注意:

  1. 如果将Teacher类的原型对象设置为Person类,会多次继承父类的属性,我们已经在子类中通过Person.call(this, name, sex, selery)继承了父类的属性,而这样设置会在子类原型中仍会有父类属性。
  2. 如果设置为Person类的原型对象,可以解决上述问题,但同时又出现一个更严重的问题,Person类将能拥有Teacher类原型对象中的独有方法,这样完全违背了我们创建类的作用,我们想要的是每个子类可以有自己独有的属性和方法。
  3. 使用Object.create创建一个Person原型对象,可避免上述问题,是最佳的继承方法。
发布了16 篇原创文章 · 获赞 46 · 访问量 6773

猜你喜欢

转载自blog.csdn.net/qq_42586895/article/details/104434576