主要把原型(链)这部分内容分以下三个部分理解和记忆,按以下记忆可能会更容易理解些:
一、两个对象;
二、两个属性;
三、一个特例;
四、两条链
两个对象
首先我把JS中的对象分为两种,一种是函数对象,一种是普通对象。
1、什么是函数对象?
function F1( ){ };
var f2 = function( ){ };
var f3 = new Function("", ""){ };
2、什么是普通对象?
var o1 = new F1( ); //理解为o1的父类是F1
var o2 = { };
var o3 = new Object( );
另记,Object 和 Function为函数对象。下文会用到上面的部分变量。
两个属性
- prototype 属性
- proto属性
1、作用
_proto_属性:
每个对象都有proto属性,它的作用就是寻找原型(链)的,有指向性。(有特例看第三个部分);
prototype 属性:
只有函数对象有prototype 属性,它就是原型,只是个普通对象(有特例),没有指向性。
2、与对象的关系
下面的内容会用到第一部分里的变量作为理解。
普通对象(只有_proto_属性):
proto属性:
普通对象.proto === 函数对象.prototype,这是一个普通对象,没有指向性。
例子:
o1.proto === F1.prototype函数对象.prototype.proto === Object.prototype
例子:
F1.prototype.proto === Object.prototype最后Object.prototype._proto === null
函数对象(两个属性都有):
proto属性:
函数对象.proto === Function.prototype,特例这是一个函数对象。且没有prototype属性。
例子:
F1.proto === Function.prototype;
Object.proto === Function.prototype;
Function.proto === Function.prototype;
prototype属性:
函数对象.prototype 是个普通对象,没有指向性,有proto属性。
一个特例
上文提过只要是prototype属性,就是一个普通对象,而Function.prototype就是一个特例,它是函数对象,而且没有prototype属性,即Function.prototype.prototype是undefine.
四、两条链
为便于理解原型链,我把它分为两条,分别是以普通对象开始和以函数对象开始的原型链。
第一条:
o1.proto === F1.prototype; F1.prototype.proto ===
Object.prototype; Object.prototype.proto === null;第二条:
F1/Object/Function.proto === Function.prototype;
Function.prototype.proto == Object.prototype;
Object.prototype.proto === null;