JavaScript中是沒有類的概念的萤捆,有的只是原型和對象。
在說原型之前先說說JavaScript中對象的三種類型:
(1)用戶創(chuàng)建的對象市怎,也就是用new關(guān)鍵字創(chuàng)建出來的對象。如:
? ? ? ? ?var obj = new Object();
(2)構(gòu)造函數(shù)(其實(shí)在JavaScript中任何非匿名函數(shù)都可以是構(gòu)造函數(shù))對象干像。如上面的Object就是個構(gòu)造函數(shù)對象麻汰。
(3)原型對象。構(gòu)造函數(shù)的prototype屬性所指向的對象五鲫。
上面三類對象的__proto__屬性所指向的對象即為該對象的原型臣镣,也對應(yīng)該對象的構(gòu)造函數(shù)的prototype屬性智亮。Function.prototype是所有函數(shù)的原型点待,Object.prototype是所有對象的祖先。因?yàn)镺bject是一個構(gòu)造函數(shù)状原,所有Object.__proto__ = Function.prototype苗踪。又因?yàn)镕unction.prototype是一個對象(原型對象),所以Function.prototype.__proto__ = Object.prototype通铲。而Function.__proto__ = Function.prototype。因?yàn)镺bject.prototype是所有對象的祖先所以有Object.prototype.__proto__ = null朋截。另外原型對象中還有一個指向構(gòu)造函數(shù)的屬性constuctor吧黄。拿Function 和 Object這兩個構(gòu)造函數(shù)為例,它們的原型屬性Function.prototype 和 Object.prototype 中都有一個constructor屬性廓八。其中Function.prototype.constructor = Function, Object.prototype.constructor = Object。
下面用一個例子來說明:
?function func(){ };
?var f = new func();
console.log( f.__proto__ == func.prototype); // true
console.log( f.__proto__.__proto__ == Object.prototype); //true
console.log( func.__proto__ == Function.prototype); // true
console.log( func.prototype.__proto__ == Object.prototype); //true
console.log( func.prototype.constructor == func); //true
console.log( Object.__proto__ == Function.prototype); //true
console.log( Object.property.__proto__ == null); //true