JavaScript中__proto__與prototype的關係
一、所有構造器/函式的__proto__都指向Function.prototype,它是一個空函式(Empty function)
1 2 3 4 5 6 7 8 9 |
Number.__proto__
=== Function.prototype //
true
Boolean.__proto__
=== Function.prototype //
true
String.__proto__
=== Function.prototype //
true
Object.__proto__
=== Function.prototype //
true
Function.__proto__
=== Function.prototype //
true
Array.__proto__
=== Function.prototype //
true
RegExp.__proto__
=== Function.prototype //
true
Error.__proto__
=== Function.prototype //
true
Date.__proto__
=== Function.prototype //
true
|
JavaScript中有內建(build-in)構造器/物件共計12個(
1 2 |
Math.__proto__
=== Object.prototype //
true
JSON.__proto__
=== Object.prototype //
true
|
上面說的“所有構造器/函式”當然包括自定義的。如下
1 2 3 4 5 6 |
//
函式宣告
function Person()
{}
//
函式表示式
var Man
= function ()
{}
console.log(Person.__proto__
=== Function.prototype) //
true
console.log(Man.__proto__
=== Function.prototype) //
true
|
這說明什麼呢?
所有的構造器都來自於Function.prototype,甚至包括根構造器Object及Function自身。所有構造器都繼承了Function.prototype的屬性及方法。如length、call、apply、bind(ES5)。
Function.prototype也是唯一一個typeof XXX.prototype為 “function”的prototype。其它的構造器的prototype都是一個物件。如下
1 2 3 4 5 6 7 8 9 10 |
console.log( typeof Function.prototype) //
function
|