继承
概念
通过【某种方式】让一个对象可以访问到另一个对象中的属性和方法,我们把这种方式称之为继承 并不是所谓的xxx extends yyy
原因
有些对象会有方法(动作、行为),而这些方法都是函数,如果把这些方法和函数都放在构造函数中声明就会导致内存的浪费
继承方式
<meta charset="utf-8">
参考:构造函数的继承http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html,
非构造函数的继承http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html;
类
JS 构造对象目前有两种方式,一种是用构造函数+prototype,一种是用 class
- 两者方式 JS 都支持,JS 是一门包容的语言,提供了多种表达形式,两者方式都能表达程序员的思想。
- 构造函数+prototype 是先提供的,class 是后提供的,说明 构造函数+prototype 是 JS 一开始的基因,而 class 的粉丝其实更喜欢 class,所以两种都有必要学习,class多是java的思想
原型链继承
利用原型让一个引用类型继承另一个引用类型的属性和方法
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
其实只要知道一个就好,只要一直记住他的原型是谁就好了
prototype 属性
- 所有函数一出生就有一个 prototype 属性
- 所有 prototype 一出生就有一个 constructor 属性
- 所有 constructor 属性一出生就保存了对应的函数的地址
- 如果一个函数不是构造函数,它依然拥有 prototype 属性,只不过这个属性暂时没什么用
eg
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHi = function() {
console.log("你好,我叫" + this.name);
};
let person = new Person("frank", 18);
person.name === "frank"; // true
person.age === 18; // true
person.sayHi(); // 打印出「你好,我叫 frank」
let person2 = new Person("jack", 19);
person2.name === "jack"; // true
person2.age === 19; // true
person2.sayHi(); // 打印出「你好,我叫 jack」
class继承
class是es6新出的功能,与prototype那个语法功能相同
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHi() {
console.log("你好,我叫" + this.name);
}
}
let person = new Person("frank", 18);
person.name === "frank"; // true
person.age === 18; // true
person.sayHi(); // 打印出「你好,我叫 frank」
let person2 = new Person("jack", 19);
person2.name === "jack"; // true
person2.age === 19; // true
person2.sayHi(); // 打印出「你好,我叫 jack」
网友评论