JavaScript原型的理解

113 阅读1分钟

本文是我自己对原型的理解,只是方便理解和记忆,概不能用于学术交流

心理表征

从字面意思来说,prototype指的是对象的初始形态,也就是实例使用哪个模板创建的。也就是说原型是对象保存的一份生成自己的模板信息。该模板可以等同于函数。

__proto__ 和 prototype

  1. __proto__是所有实例对象都有的属性,指向创建他的“模板”的prototype;
  2. prototype 是“模板”特有的属性,用来给实例继承用的,prototype包含一个constructor属性,指向“模板函数”本身;
  3. “模板”也是一个对象,所以也会有__proto__属性;
  4. __proto__ 和 prototype本身是一个对象,所以这两个对象都有__proto__属性(实现多级继承);
  5. 边界问题: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关键字

  1. 创建一个空的简单JavaScript对象(即{});
  2. 为步骤1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象 ;
  3. 将步骤1新创建的对象作为this的上下文 ;
  4. 如果该函数没有返回对象,则返回this

由此可见“实例说明”中Foo不能有返回值,不然上述结论就不对了。 使用new执行和直接