1. 程式人生 > >先有物件還是先有函式,雞生蛋、蛋生雞的問題。有關js裡內建物件Function和Object的思考

先有物件還是先有函式,雞生蛋、蛋生雞的問題。有關js裡內建物件Function和Object的思考

js裡建立的函式本身作為一個例項物件都是由內建物件Function作為建構函式創造出來的,所謂var f = funciton(a){b}即等同於f = new Function(a,b)。

同時js裡Object也是一個建構函式,因此他也是Function加工出來的。

Function作為一個物件例項,也是Function加工出來的,具有自原性。

但Function的加工原料,也就是原型鏈的父原型是Object,即Object可以通過Function變成Function。

那麼是什麼通過Function的加工變成了Object呢?

這就是最原始的那個靜態種子,答案就是Object.prototype,在控制檯裡打印出來是:

  1. {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
    1. constructor: ƒ Object()
    2. hasOwnProperty: ƒ hasOwnProperty()
    3. isPrototypeOf: ƒ isPrototypeOf()
    4. propertyIsEnumerable: ƒ propertyIsEnumerable()
    5. toLocaleString: ƒ toLocaleString()
    6. toString: ƒ toString()
    7. valueOf: ƒ valueOf()
    8. __defineGetter__: ƒ __defineGetter__()
    9. __defineSetter__: ƒ __defineSetter__()
    10. __lookupGetter__: ƒ __lookupGetter__()
    11. __lookupSetter__: ƒ __lookupSetter__()
    12. get __proto__: ƒ __proto__()
    13. set __proto__: ƒ __proto__()

而Object.prototype.__proto__==null

Object.prototype.constructor==Object()

那麼這就可以這樣來梳理了,null作為原料通過Object函式構造出了Object.prototype,

Object.prototype作為原料通過Function函式構造出了Object,

Object作為原料通過Function函式構造出了Function本身。

完美解決了,對吧!

但是null作為Global的一個屬性,也就是一個物件,又回到了原始的問題!

但是對於js的創造者來說,僅僅是利用一些屬性相等搭了一個圈,但沉浸在這個世界的人們就永遠也看不到其中事物的本源了。

這大概和雞生蛋還是蛋生雞這樣的哲學本源問題是一致的,就像無論唯心還是唯物,在 西部世界 裡所追尋的那個迷宮的核心究竟如何,只要還在其中,就是永遠沒有答案的。