2012-12-17 47 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