概念:1.每一个函数都有一个prototype属性,即显示原型
2.每一个实例对象都有一个__proto__属性,即隐式原型
3.每一个实例对象的隐式原型__proto__属性,即执行自身构造函数的prototype
4.每一个prototype原型都有一个constructor属性,指向它关联的够造函数
1.2怎么定义?
通常使用构造器(函数体)定义属性,使用原型对象(prototype)定义方法。
如此,构造器只包含属性定义,而方法则分装在不同的代码块,使代码更具可读性:
// 构造器内定义属性function Fun(a, b) { this.a = a; this.b = b;}// 原型属性定义方法Fun.prototype.c = function() { return this.a + this.b;}// etc...注意,千万不要使用字面量方式来定义属性和方法,否则原有属性和方法会被重写:function Fn() {};// 定义属性Fn.prototype.a = 1;Fn.prototype.b = 2;// 字面量定义方法,原型被重写,原有属性和方法被更新Fn.prototype = { c : function() { return this.a + this.b; }}var foo = new Fn();foo.c(); // NaNfoo.a; // undefinedfoo.b; // undefined1.3.三者之间的关系
2.1原型链获取对象属性时,如果对象本身没有这个属性,那就会去他的原型__proto__上去找,如果还查不到,就去找原型的原型,一直找到最顶层(Object.prototype)为止。Object.prototype对象也有proto属性值为null