讲解用到的代码很简单,以下json
function Foo(){
//属性和方法
}
var f1 = new Foo();
var f2 = new Foo();
var o1 = new Object();
var o2 = new Object();
复制代码
一切皆对象,对象又能够分为两类:浏览器
由function创造出来的函数:bash
function f1() {
} // 匿名函数
var f2 = function() {
}
var f3 = new Function('x','console.log(x)');
// 以上都是函数对象
复制代码
系统内置的函数对象: Function、Object、Array、String、Number ,Function其实充当了函数对象的构造器,好比Object对象的构造源码实际上是Function Object() {[native code]}的形式,这一点对于理解原型链很重要。函数
每一个对象都有__proto__
属性,用于储存继承得来的方法和属性;每一个函数对象都有prototype
属性,用于继承,将其中定义的属性和方法传递给‘后代’(好比实例化)。post
f1为什么有Foo、Object的原型方法,其实就是经过原型链继承。继承的过程能够表示为f1.__proto__ = Foo.prototype
,即对象.__proto__ = 构造器.prototype
。学习
new实例实现继承的过程其实与上面原理相同,new的过程能够拆解为下面几个步骤:ui
var temp = {};
temp.__proto__ = Foo.prototype; // 原型继承
var f1 = Foo.call(temp);
return f1;
复制代码
f1.__proto__ == Foo.prototype
;Foo.prototype.__proto__ == Object.prototype
;Object.prototype.__proto__ == null
;f1的原型链能够用图形表示:spa
能够在浏览器console打印验证:prototype
Foo.__proto__ == Function.prototype
;Function.prototype.__proto__ == Object.prototype
;Object.prototype.__proto__ == null
;Foo的原型链能够用图形表示为:3d
列出两种原型链的目的是:
当js引擎执行对象的属性或方法时,先查找对象自己是否存在该方法,若是不存在则会在原型链上查找。
于是f1拥有Foo、Object的原型方法,Foo拥有Function、Object的原型方法。
注意,虽然f1原型链其中有一链是涉及到函数对象Foo,但f1并不拥有Function的原型方法,由于原型链并无延伸到Function。
好比下图中bind是Function的原型方法,f1并无拥有。
如何找出一个对象的原型链,只须要两步
关于最上面的图形,只剩Object和Function的特殊关系和构造函数constructor没有讲到, 了解Object和Function的关系,戳这儿~
若是有讲不清和讲错了的地方,请帮我指出来,我也跟你们一块儿在学习中,请轻喷(●ˇ∀ˇ●)