看过构造函数和原型链的很多文章,要么直接讲的比较突兀,不适合新手看,要么只是讲了一部分,今天我来做个了断,梳理一下自己的理解,还请各路大神不吝赐教。 (文中部分推论仅为个人观点,希望不会把谁谁带进小黑沟里)
一 菩提本无树,明镜亦非台
万物皆对象,对象从何而来?
var a = {};
var b = new Object();
var c = Object();
var d = new fn();
var ga = Object.create(null);
var gb = Object.create({});
var gc = Object.create(d);
// 其实都是实例化构造函数
function user(){
this.name = 'tom';
}
fn.prototype.age = 18;
var objTom = new user();
二 江有碧水 山有青松
构造函数有 .prototype .__proto__ 对象有 .__proto__ (prototype 又是对象)
objTom.__proto__ 指向 fn.prototype
fn.prototype.__proto__ 指向 Object.prototype
Object.prototype.__proto__ 指向 null
这是最常见的原型链
三 人过留名 雁过留声
objTom 的咏春拳了得,但是如何表明自己是师出正派 user 呢? 通过constructor
也就是说 判定一个对象是哪个门派有两条,一功夫正宗 二功夫师出何门。
var objJohn = {}
objJohn.__proto__ = user.prototype
objJohn.constructor = user
经过两步 objJohn 正式成为咏春弟子,当然,学了功夫背叛师门的也是有的。
师父的功夫哪里来的呢?当然是自己悟出来的。
四 创始之初 皆为混沌
user虽然是函数,但也是对象,通过关键字 function 声明即可,其实还是由 Function 创建(个人理解)。但是Function这种原始天尊又由何而来?
Function 创建了自己,自身的prototype __proto__都是function类型。尽管自己给自己用泥巴捏身体,但是这个泥巴(Function.prototype 函数)从何而来呢?
虽然 Function 能创建自己 但是还是依赖于 Object和Object.prototype(我们叫他混沌之灵吧)。
Object 用 Object.prototype 创建了 Function.prototype 函数(对象) (因为指向他的__proto__)
Function 用 Function.prototype 创建了 Function 函数(对象) (因为指向他的__proto__)
Function 用 Function.prototype 创建了 user 函数(对象) (因为指向他的__proto__)
user 用 user.prototype 创建了 objTom 对象 (因为指向他的__proto__)
问题又来了,Object 构造函数从哪里来的呢
总算可以出一口气了。上图我们可以看到。
1 Object 函数还是 原始天尊 Function 生产出来的。
2 Object.prototype 我们的混沌之灵来自 null
所以小小的更新下结论,这个不是鸡和鸡蛋的问题,是从无到有,从简单到复杂的过程。
无 -> 混沌之灵 -> 原始天尊 -> 构造函数 -> 普通对象
null -> Object.prototype -> Function -> Object user等 -> objTom
盗图一张 如有侵权请联系 我会尽快删除
最后
加个鸡蛋 Array.prototype 你知道是什么类型么? 数组,没错!
查看这些你会更多发现
Object.prototype.toString.call(Array.prototype) // "[object Array]"
Object.prototype.toString.call(String.prototype) // ?
Object.prototype.toString.call(Function.prototype) // ?
Object.prototype.toString.call(Number.prototype) // ?
Object.prototype.toString.call(Boolean.prototype) // ?
终于看完了,我也终于写完了,表述可还清楚?!看懂了?!
好了,就到这里了,以上仅为个人对原型链的一些认识,重点或许有些跑偏甚至是错误的,还望前辈不吝指正。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。