一、原型
每个函数都有一个prototype属性,该属性指向一个对象。
每个引用类型都有一个__proto__属性,该属性指向其构造函数的prototype。
引用类型的没有prototype属性,该属性仅函数拥有。
function Preson(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
var men = new Preson();
console.log(men.__proto__ === Preson.prototype);//true
console.log(men.prototype);//undefined
二、原型链
function Preson(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Preson.prototype.men = "男人";
var xy = new Preson("咸鱼",120,"男");
console.log(xy);
console.log(xy.men);//打印:男人
当我们这样定义时,men这个属性无法在xy的正常属性里找到,原因在于该属性被定义在隐式原型里,但是我们却可以直接访问这个属性,原因在于我们查找引用类型的某个属性或者方法时,会在自身的属性里优先查找,如果不存在,则会去它的隐式原型(__proto__)上查找,相当于构造器Preson的__proto__,如果还不存在,则会去Preson的构造函数里的prototype的__proto__里查找,像这样顺着向上查找原型称为原型链,这样的查找会持续到Object.prototype.__proto__结束,此时的结果为null,如果查到到null还没有找到说明该方法或者属性不存在,返回undefined。
Preson.prototype.men = "男人";
//构造函数Preson的隐式原型包含了men属性,而xy由Preson构造,所以xy的__proto__包含men属性
console.log(xy.__proto__.men === xy.men);//true
Object.prototype.men = "男人";
//Object是Preson的构造函数,所以当xy调用men属性时,相当于调用了Prenson的构造Object里__proto__的men属性
console.log(Object.__proto__.men === xy.__proto__.__proto__.men);//true
(个人理解,如有错误欢迎指正)