每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。
核心:实例对象的隐式原型的值为其对应构造函数的显式原型的值
function Fun(){ //内部自动执行语句:this.prototype={}; }
1.每个函数function
都有一 个prototype, 定义函数时自动添加,显式原型prototype是一个对象,且默认指向一个空的Object对象
console.log(Fun.prototype);
2.每个实例对象
(除了 null )都有一个__proto__属性, 称为隐式原型,这个属性会指向该对象的原型
let obj = new Fun();//内部自动执行语句:this.__proto__=Fun.prototype; console.log(obj .__proto__);
3.实例对象的隐式原型的值为其对应构造函数的显式原型的值
console.log(obj .__proto__ == Fun.prototype);//true
Fun.prototype.test=function(){ console.log("在函数的显示原型属性中添加方法"); } obj.test()//使用隐式原型调用显示原型定义的方法
总结:
实例看隐式原型
函数看显示原型
原型链使用来查找属性值的
1.读取对象的属性值时: 会自动到原型链中查找
2.设置对象的属性值时不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
3.方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
function Fn() {} Fn.prototype.a ='AAA'; var fn1=new Fn(); console.log(fn1.a);//AAA var fn2 = new Fn(); fn2.a = 'BBB';//设置对象的属性值时不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值 console.log(fn1.a, fn2.a)//AAA , BBB
最后推荐一篇好文章《JavaScript深入之从原型到原型链 #2》