1.在js中全部的实例对象(除了null和undefined)都有一个__proto__(注意不是prototype)属性指向构造函数的原型(即下图中的num.__proto__===Number.prototype;str.__proto__===Object.prototype
) vue
Foo.prototype.__proto__===Object.prototype
)
4.全部函数的__proto__属性指向Function的prototype属性 react
Object.prototype.__proto__===null
有了以上的理论基础,下图所示就是Js中所谓的原型啦(哇~,这图真JB丑,没办法,男人嘛)webpack
下图所示就是Js中所谓的原型链啦(这图稍微好看点,不错不错有点进步),不知道细心的你发现没有Function的prototype和__proto__属性都是指向Function.prototype的(有些高大上的公司面试的时候是有可能会问这个的呦)web
原型和原型链最主要的应用场景就是继承了,基本的形式就是当访问一个实例对象上的属性或方法的时候要是本身身上没有,就往__proto__属性上找,若是没有的话再往上找,直到找到Object.prototype.__proto__
上为止,要是实在找不到的话就返回undefined.这里举一个组合继承的例子,应该都懂的啦,面试
function Person(name){
this.name=name;
}
Person.prototype.sayHello=function(){
alert(this.name);
}
function Teacher(name,career){
Person.call(this,name);
this.career=career;
}
Teacher.prototype=Person.prototype;
Teacher.prototype.constructor=Teacher;
Teacher.prototype.sayWord=function(){
this.sayHello();
alert(this.career);
}
var teacher=new Teacher('隔壁老王','我是老师');
teacher.sayWord();
复制代码
虽然我在上面写的很起劲,可是在实际的应用中上面的继承方式可能已通过时了,由于咱们有了ES6的class,Bable转码,webpack打包,react/vue的工程化开发等。bash