1.在JS里,萬物皆對象。方法(Function)是對象,方法的原型(Function.prototype)是對象。因此,它們都會具有對象共有的特點。即:對象具有屬性proto,可稱為隱式原型,一個對象的隱式原型指向構造該對象的構造函數的原型,這也保證了實例能夠訪問在構造函數原型中定義的屬性和方法。
2.方法(Function)方法這個特殊的對象,除了和其他對象一樣有上述proto屬性之外,還有自己特有的屬性——原型屬性(prototype),這個屬性是一個指針,指向一個對象,這個對象的用途就是包含所有實例共享的屬性和方法(我們把這個對象叫做原型對象)。原型對象也有一個屬性,叫做constructor,這個屬性包含了一個指針,指回原構造函數。
1.聲明對象和方法
var a=function(){} var b={}
2.關於__proto__,它是對象上的隱式屬性
console.log(a.__proto__)
console.log(b.__proto__)
可以看到他們的__proto__不一樣,雖然function也是屬於對象,但func的隱式原型指向構造該對象的構造函數的原型
console.log(a.__proto__.__proto__)
console.log(b.__proto__)
console.log(a.__proto__.__proto__==b.__proto__) // true
3.關於prototype,對象上不具有prototype,只有函數上有
console.log(a.prototype)
console.log(b.prototype)
prototype下面具有constructor,這個屬性包含了一個指針,指回原構造函數原型 f(),__proto__屬性指向對象構造函數原型 Object()
console.log(a.prototype.constructor.__proto__==a.__proto__)
console.log(a.prototype.__proto__==a.__proto__.__proto__)
console.log(a.prototype.__proto__==b.__proto__)