本文是我自己对原型的理解,只是方便理解和记忆,概不能用于学术交流
心理表征
从字面意思来说,prototype指的是对象的初始形态,也就是实例使用哪个模板创建的。也就是说原型是对象保存的一份生成自己的模板信息。该模板可以等同于函数。
__proto__ 和 prototype
- __proto__是所有的实例对象都有的属性,指向创建他的“模板”的prototype;
- prototype 是“模板”特有的属性,用来给实例继承用的,prototype包含一个constructor属性,指向“模板函数”本身;
- “模板”也是一个对象,所以也会有__proto__属性;
- __proto__ 和 prototype本身是一个对象,所以这两个对象都有__proto__属性(实现多级继承);
- 边界问题:prototype默认继承Object.prototype,Object.prototype.__proto__ = null;
实例说明
function Foo() {
this.a = 1;
}
var f = new Foo();
// f只有__proto__属性, 指向Foo.prototype(规则1)
console.log(f.__proto__ === Foo.prototype); // true
// 规则2
console.log(Foo.prototype.constructor === Foo); // true
// 由于函数都是Function创建的,所以Foo的原型指向Function(规则3)
console.log(Foo.__proto__ === Function.prototype); // true
// prototype默认继承Object,这个是实现多级继承的基础,可以将Foo.prototype.__proto__指向任何其他prototype(规则4)
console.log(Foo.prototype.__proto__ === Object.prototype); // true
不得不说的new关键字
- 创建一个空的简单
JavaScript对象(即{}); - 为步骤
1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象 ; - 将步骤
1新创建的对象作为this的上下文 ; - 如果该函数没有返回对象,则返回
this。
由此可见“实例说明”中Foo不能有返回值,不然上述结论就不对了。 使用new执行和直接