1.1 什么是原型?
概念: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(); // NaN
foo.a; // undefined
foo.b; // undefined
1.3.三者之间的关系