这里是学习class时的一些笔记
class 是一个关键字,可以用它来创造一个构造函数,有基于对象原型的继承,这种创建方式比传统方法更有效。我们可以瞧瞧他们之间的区别。
constructor:
MDN:constructor方法是一种特殊的方法,目的是为了在class内部创造和初始化一个对象。
从文档里理解起来有一点点难度,它是一个方法,目的就是为了实例化对象。所谓实例化就是这个用构造函数创造一个具体对象的过程。我们通常把一些设计好的初始化数据放在里面。其实这里的constructor 和 原型里面的constructor 不是同一个,因为它们指向的对象不同。构造函数原型里面的constructor指向的是构造函数本身,而class里面的constructor 就是指向它后面跟的那个函数
//第一、我们来研究class是创造构造函数的关键字。它是一个关键字,目的是为了创造构造函数。
// 1.我们先用传统的方法来写一个构造函数
function Person(name, age){
this.name = name;
this.age = age;
this.say = function () {
console.log("Hello, my name is " + this.name + " and I am " + this.age);
}
}
let xiaoWan = new Person("xiaoWan", 23);
xiaoWan.say();
// 2.接下来我们用class来创建一个构造函数
class Human{
constructor (name, age) {
this.name = name;
this.age = age;
}
say() { //这里是用的ES6 的函数写法,和上面那个say是一样的
console.log("Hello, my name is " + this.name + " and I am " + this.age)
}
}
let laoLi = new Human("laoLi", 32);
laoLi.say();
// 所以我们可以看到,其实他们的效果是一样的。但是既然有了class,那么就应该有它的新特性才对,不然我们干嘛要弄一个class出来。那我们接下来就研究一下他们之间的区别吧。
//第二、 基于原型的继承,这就是它们的区别所在,也是class比较强大的地方。我们用class来做继承是非常方便的。
//1. 我们先用传统方法来做继承: 让Student继承自Person
function Student (name, age, grade, major){
Person.call(this, name, age);// 继承Person的属性和值
this.grade = grade;
this.major = major;
this.study = function () {
console.log(`I am ${this.name} studying ${this.major}`);// ES6新语法,在字符串中用$符来添加变量字符串
}
}
let student1 = new Student("xiaoMin", 19, "freshman", "computer science" );
student1.study();
student1.say();
// 从结果中我们可以看到,student1.say()是可以执行,即使我们在它的构造函数里并没有写这个方法。当执行这个语句的时候,系统发现Student里面并没有这个方法,然后就去它的爹那里找,也就是Person里找,然后果然找到了。
// 2. 我们再用class方法来做继承
class Scholar extends Person{
constructor (name, age, grade, major){
super(name, age);
this.grade = grade;
this.major = major;
}
study() {
console.log(`I am ${this.grade} studying ${this.major}`);
}
}
let student2 = new Scholar("xiaoHong", 20, "sophomore", "financial management");
student2.study();
student2.say();
// 首先,用class来做继承便于阅读,第一句就是Scholar 继承 Person。其实extend的原意是“扩展,延伸”的意思,也就是Scholar 扩展至 Person。能理解的就理解,不能的就把它当做“继承” 的意思。然后 class 里面一般把方法放在外面,然后把其他的属性放到constructor里面,这样结构很有层次感,便于阅读和理解。其实class里面还有两个关键字get 和 set。这两个关键字也很强大, 可以用来处理输入和输出。