详解JavaScript类
类和对象
-
认识类前,首先我们先了解一下对象。所谓对象,实质上就是一个具体的事物在
Javascript
语言中的表现形式。比如对象可以是一只猫,猫具有它的特征:颜色、种类、体重等,也能做一些事情:奔跑、喵喵叫、爬树等。它的这些特征就叫做猫对象的属性,行为就是猫对象的方法。对象往往用名词来表示,如:Bood, Person
属性一般用形容词表示
方法一般用动词表示,如:speak, run -
相似的对象之间往往有很多共同的特征。比如老虎和狮子都具有动物的特征,因此它们可以被统称为动物类。“ 对象 ” 这个词我们有时候也可以叫 “ 实例 ”,所以我们可以认为,老虎和狮子都是动物类的实例。我们能基于相同的类创建出许多不同的对象。类就像是一种模板,而对象就是在这些模板的基础上被创建出来的。
类的声明
-
构造函数方法(必须掌握)
function Person1(name, sex){ this.name = name; this.sex = sex; } Person1.prototype.job = function(){} let p1 = new Person1('lili', 'gril');
-
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);
注意:
- 如果将Teacher类的原型对象设置为Person类,会多次继承父类的属性,我们已经在子类中通过
Person.call(this, name, sex, selery)
继承了父类的属性,而这样设置会在子类原型中仍会有父类属性。 - 如果设置为Person类的原型对象,可以解决上述问题,但同时又出现一个更严重的问题,Person类将能拥有Teacher类原型对象中的独有方法,这样完全违背了我们创建类的作用,我们想要的是每个子类可以有自己独有的属性和方法。
- 使用Object.create创建一个Person原型对象,可避免上述问题,是最佳的继承方法。