JavaScript是一门基于原型的语言,它的继承是以原型链来继承的
首先来说一说什么是原型
JavaScript中创建的每一函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象的作用是包含可以由特定类型实例共享的属性和方法,这个对象就是函数的原型对象。
有了原型概念之后,看一下函数创建的过程
1 | function A(){} |
当我们在代码里面声明这么一个空函数,JS解析可以理解为:
1.创建一个对象,有construtors属性及prototype属性
2.创建一个函数,有name、prototype属性。(函数的prototype属性指向了上面创建的对象,也就是它的原型对象,也就是引用刚才创建的对象)
3.创建了变量A,同时把函数引用赋值给变量A
接下来我们看一下Prototype的作用
1 | function A(name){ this.name="name" } A.prototype.say=function(){ console.log("我的名字是"+this.name); } var B = new A("xiaoming")//B.prototype=A.prototype; console.log(B.say)//我的名字是小明 |
了解了prototype的作用,因为每个对象都有一个Prototype属性,所以它保存的地址就构成了对象的原型链,js的继承就是以原型链来继承的。对象在查找某个属性时,首先会遍历自身的属性,如果没有会继续查找Prototype引用的对象,如果再没有则继续往上查找prototype引用对象,以此类推。
继承
1 | function c(name){ this.name=name; } function b(){ this.age=15; } b.prototype.say=function(){ console.log("我今年"+this.age+"岁"); } c.prototype=new b(); var v = new c("xiao"); v.say(); //我今年15岁 |
把函数c的原型指向函数b的实例,这样函数c就继承了函数b的属性,形成了原型链