JavaScript 原型及原型链

参考:
MollyPages.org
javascript 原型链继承
JavaScript:constructor 属性

JavaScript 原型及原型链

原型的基本概念

  • 所有的实例都继承自创建他们的构造函数的 prototype 对象

  • 实例拥有一个特殊的实现 __proto__指针,它指向创建者的 prototype 对象

  • 无论是否存在 __proto__,所有的函数都存在 prototype 对象,它拥有一个 constructor 属性指向函数自身,这个属性是只读的。

  • constructor 属性始终指向创建当前对象的构造函数

    1
    2
    3
    4
    5
    var M = new Function() {this.name = 'name'};
    var m = new M;

    M.constructor === Function // true
    m.constructor === M //true
  • 所有对象的原型最终都会指向 Object 对象的原型

    1
    2
    3
    4
    5
    6
    function Foo(){};
    var foo=new Foo();

    console.log(foo.__proto__); //指向Foo构造函数的原型
    console.log(foo.__proto__.__proto__); //指向Object构造函数的原型
    console.log(foo.__proto__.__proto__.__proto__); //null

instanceof 的原理

instanceof 检测一个对象 A 是不是另一个对象 B 的实例的原理是:查看对象B的prototype 指向的对象是否在对象 A 的 [[prototype]] 链上。如果在,则返回 true ,如果不在则返回 false。不过有一个特殊的情况,当对象 Bprototype 为 null 将会报错(类似于空指针异常)。

new 运算符的原理

1
2
3
4
var M = function() {
this.name = "M"
}
var m = new M()
  • 创建一个对象 m,它继承自 M.prototype
  • 构造函数 M 会被执行,执行的时候,可以传递参数。同时上下文 this,执行新创建的对象 m
  • 如果构造函数 m 返回了一个对象,那么 new 的结果将会是这个对象,而不是对象 m