__proto__函数

时间:2010-05-20 08:57:35

标签: javascript

如果我有一个名为Person的课程。

var Person =  function(fname, lname){
    this.fname = fname;
    this.lname = lname;
}

Person.prototype.mname = "Test";
var p = new Person('Alice','Bob');

现在,p.__proto__指的是人的原型,但是,当我尝试Person.__proto__时,它指向function()Person.constructor指向Function()

有人可以解释function()Function()之间的区别以及为什么Function()类的原型是function()

2 个答案:

答案 0 :(得分:2)

  

有人可以解释一下function()和Function()之间的区别是什么以及为什么Function()类的原型是一个函数()?

__proto__是一个暴露[[prototype]]的实现细节。 [[prototype]]和构造函数不需要(通常不是)相同的东西。总之...

考虑这个假设:这是一个impl。依赖于引擎的细节 - 并且在测试的特定引擎中(FF,哪个版本?),Function是一个本身具有[[prototype]]函数的对象。 function是原始的function-object。 Person.prototype是(默认情况下)类型函数(原始函数 - 对象)和由于这种明显的二分法而声明的断言。 (JS有一些怪癖:new Number(0)0不同。)

然而,在IE(8)中并非如此。在IE中,默认原型是“普通对象”,而不是函数对象。

答案 1 :(得分:1)

定义这样的函数时:

var Person = function (fname, lname){
    this.fname = fname;
    this.lname = lname;
}

这将使Person成为一个功能。函数是一个对象,需要像任何其他“第一类”对象一样构造,因此它有一个构造函数:所有函数对象的构造函数,称为Function

所有函数的原型似乎都是一个名为function的对象。

我想引用一个很了解我的好explanation by Mike Koss