什么是原型?
说到原型就离不开构造函数,构造函数是用来创建对象时初始化对象的一种方法,每个构造函数都有prototype属性,该属性指向一个对象(原型对象)。原型对象上面所定义的方法和属性,都将被共享给其实例。每个实例的__proto__属性,指向的就是当前类/构造函数的prototype属性。
ES5 和 ES6 如何定义构造函数(类)?
ES5
```
function Person(name){
this.name = name
}
// 在原型上添加方法,为实例对象所用
Person.prototype.sayName = function(){
console.log(this.name)
}
let first_person = new Person('king')
first_person.sayName() // "king"
console.log(first_person) // Person:{name:"king"}
```
ES6
```
class Person{
constructor(name){
this.name = name
}
// 定义方法
sayName(){
console.log(this.name)
}
}
let first_person = new Person('king')
first_person.sayName() // "king"
console.log(first_person) // Person:{name:"king"}
```
如何继承(ES5 && ES6)?
ES5采用组合继承
1. 子类构造函数中调用父类的构造函数
```
function Child(obj){
Parent.call(this,obj)
}
```
2. 根据父类的原型对象,创建子类的原型对象
```
Child.prototype = Object.create(Parent.prototype)
Child.prototype.constructor = Child //修改构造器指向
```
ES6 : 关键字extends
class Child extends Parent{
constructor(name,age){
super(name) //相当于把父类的constructor函数在此调用。 super还有很多种用法及属性,具体查看ES6文档
this.age= age
}
}
什么是原型链?
当你访问某个实例对象的属性或者方法时,会触发其get方法,首先会在自身查找有无对应的属性或者方法,如果没有就去__proto__属性上查找,层层追述,一直到顶层Object停止,因为Object的__proto__是null。这个追述的过程就叫做沿着原型链查找。