参考:
MollyPages.org
javascript 原型链继承
JavaScript:constructor 属性
JavaScript 原型及原型链
原型的基本概念
所有的实例都继承自创建他们的构造函数的
prototype
对象实例拥有一个特殊的实现
__proto__
指针,它指向创建者的prototype
对象无论是否存在
__proto__
,所有的函数都存在prototype
对象,它拥有一个constructor
属性指向函数自身,这个属性是只读的。constructor
属性始终指向创建当前对象的构造函数1
2
3
4
5var M = new Function() {this.name = 'name'};
var m = new M;
M.constructor === Function // true
m.constructor === M //true所有对象的原型最终都会指向
Object
对象的原型1
2
3
4
5
6function 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
。不过有一个特殊的情况,当对象 B
的 prototype
为 null 将会报错(类似于空指针异常)。
new 运算符的原理
1 | var M = function() { |
- 创建一个对象
m
,它继承自M.prototype
- 构造函数
M
会被执行,执行的时候,可以传递参数。同时上下文this
,执行新创建的对象m
- 如果构造函数
m
返回了一个对象,那么new
的结果将会是这个对象,而不是对象m