2012-12-17 130 views
0

所以我一直在做大量的關於原型的閱讀,我大部分都是這樣理解的,我的意思是,我得到以下內容。函數和對象的原型構造函數

var Animal = function(species) { 
    this.species = species; 
}; 
Animal.prototype.getSpecies = function() { 
    return this.species; 
} 
var myDog = new Animal("Anderson");  
alert(myDog.getSpecies()); 

我甚至知道我可以創建一個新的物種,並設置原型動物,然後能夠調用getSpecies()。是啊!

什麼讓我困惑的是:

var Person = function(firstName, lastName) { 
    this.firstName= firstName; 
    this.lastName= lastName 
}; 

var meToo = { fName: "ken", lName: "N" }; 
alert(meToo.constructor.prototype); // [object Object] 
alert(Person.constructor.prototype); // function Empty(){} 

http://jsfiddle.net/r0k3t/s8Sx7/9/

我試圖找到的東西,解釋了爲什麼原型人物是函數(){}?我認爲它會設置爲全局對象'this'(在本例中爲window)。另外 - 爲什麼我不能枚舉它的屬性?讀this會建議我可以使用constructor.prototype檢索我認爲是'window'的對象,然後枚舉這些屬性。

很顯然我錯過了一些東西 - 謝謝!

+0

嘗試的console.log(meToo.constructor.prototype)創建任何 – mplungjan

+0

下面是使用記錄更新的小提琴http://jsfiddle.net/r0k3t/s8Sx7/ 14/ – Kenn

回答

3

Person對象的原型,只是Person.prototype。不是Person.constructor.prototype,這是非常不同的:

Person.constructor,是Function函數,它構造了所有函數。因爲Person是一個函數,所以它的.constructorFunction

Function物體(所有功能)的原型,只是Function.prototype。所以,Person.constructor.prototype === Function.prototype

普通對象的構造函數是Object函數。所有普通物體的原型是Object.prototype,這是一個"[object Object]"(優先console.dir優於alert,以查看更多)。

通過普通的對象,我指的是{}new Object()

+0

那麼,爲什麼安格斯克羅爾說:「另外,除了IE之外的所有瀏覽器都支持非標準訪問器__proto__。如果我們不能問這個對象的構造函數是否屬於它的原型屬性。它聽起來像Object.getPrototypeOf(myThing)將返回與myThing.constructor.prototype相同的東西?我的意思是,你說的話很有道理,但顯然我仍然錯過了一些東西。嗯? – Kenn

+0

@Kenn是的,只要構造函數屬性不被插入:'myThing .__ proto__ === Object.getPrototypeOf(myThing)=== myThing.constructor.prototype' – Esailija

+0

@Kenn並且您創建了一個新的Person對象。 var person = new Person()',那麼同樣適用:'person .__ proto__ === Object.getPrototypeOf(person)=== person.constructor.prototype'請注意,我指的是小寫'person.constructor',而不是'Person.constructor' – Esailija