Js中经过原型和原型链实现了继承函数
Js对象属性的访问,首先会查找自身是否拥有这个属性this
若是查到,则返回属性值,若是找不到,就会遍历原型链,一层一层的查找,若是找到就会返回属性值spa
直到遍历完Object.prototype尚未找到,则返回undefinedprototype
对象中有:__proto__(原型),函数也是对象,因此也有__proto__code
构造函数中有:prototype对象,默认有一个叫作constructor的属性,指向这个构造函数自己。对象
对象的__proto__(原型)引用了建立这个对象的构造函数的prototype对象blog
1 function Baz() {} 2 3 Baz.prototype.sayAge = function() { 4 console.log(this.age); 5 } 6 7 function Bar() { 8 this.name = 'Gary'; 9 this.age = 20; 10 } 11 12 Bar.prototype = Object.create(Baz.prototype); 13 Bar.prototype.constructor = Bar; 14 Bar.prototype.sayName = function() { 15 console.log(this.name) 16 } 17 18 var obj = new Bar(); 19 20 console.log(obj.sayAge()); //20
分析:继承
obj对象由Bar构造函数建立,因此obj对象的__proto__(原型)指向Bar.prototype原型链
在Bar.prototype中使用object.create(),使得Bar.prototype的__proto__指向了Baz.prototype原型
Baz.prototype是一个对象,由构造函数Object建立,因此Baz.prototype的__proto__指向了Object.prototype
特殊的:最后Object.peototype的__proto__指向null
由此构成的一条原型链:obj -> Bar.prototype -> Baz.prototype -> Object.prototype -> null
根据开头的对象属性查找规则,obj调用sayAge打印出了20
几个原型指向:
function fn(){...} ===>>> var fn = new Function(...)
因此函数的__proto__指向Function.prototype
同理:
function Object(){} ===>>> var obj = new Object()
function Function(){} ===>>> var fn = new Function()
构造函数的__proto__指向Function.prototype