JavaScript中是没有类的概念的,有的只是原型和对象。
在说原型之前先说说JavaScript中对象的三种类型:
(1)用户创建的对象,也就是用new关键字创建出来的对象。如:
var obj = new Object();
(2)构造函数(其实在JavaScript中任何非匿名函数都可以是构造函数)对象。如上面的Object就是个构造函数对象。
(3)原型对象。构造函数的prototype属性所指向的对象。
上面三类对象的__proto__属性所指向的对象即为该对象的原型,也对应该对象的构造函数的prototype属性。Function.prototype是所有函数的原型,Object.prototype是所有对象的祖先。因为Object是一个构造函数,所有Object.__proto__ = Function.prototype。又因为Function.prototype是一个对象(原型对象),所以Function.prototype.__proto__ = Object.prototype。而Function.__proto__ = Function.prototype。因为Object.prototype是所有对象的祖先所以有Object.prototype.__proto__ = null。另外原型对象中还有一个指向构造函数的属性constuctor。拿Function 和 Object这两个构造函数为例,它们的原型属性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