Javascript原型问题

时间:2010-05-09 21:20:55

标签: javascript

我只是阅读JavaScript中的原型和道格拉斯·克罗克福德提供的选择新对象原型的绝佳方法,但任何人都可以解释(下面)为什么obj01的类型等于'对象'当我在函数中传递它时它的原型?< / p>

if (typeof Object.beget !== 'function') {
     Object.beget = function (o) {
         console.log(typeof o);//function
         var F = function () {};
         F.prototype = o;
         console.log(typeof F);//function
         return new F();
     };
}
var func01 = function(){};
var obj01 = Object.beget(func01);
console.log(typeof obj01);//object
console.log(typeof obj01.prototype);//object

我以为会是

console.log(typeof obj01);//function
console.log(typeof obj01.prototype);//function

2 个答案:

答案 0 :(得分:4)

obj01只是一个从函数对象继承的对象,不能以这种方式创建函数。

typeof运算符仅在其操作数本身 callable 时返回"function"

创建函数对象的方法只有三种:

功能声明:

function name (/*arg, argn...*/) {
}

功能表达:

var fn = function /*nameopt*/ (/*arg, argn...*/) {
};

函数构造函数:

var fn = new Function("arg", "argn", "FunctionBody");

修改:为了回应您的评论,obj01只是一个对象,其原型链包含一个函数对象,然后是Function.prototype,然后是Object.prototype但这不会使对象可调用

你的对象不是可调用的,函数只是对象,但它们有一些特殊的内部属性,允许它们表现得像那样。

只有当 实现内部[[Call]]属性时,对象才可以调用

函数对象还有其他内部属性,如[[Construct]],在使用new运算符时调用,[[Scope]]属性存储函数的词法环境执行,等等。

如果您尝试调用对象,就好像它是一个函数一样,那么您将拥有TypeError,因为当您创建function call时,该对象需要具有[[Call]]内部属性。

函数对象需要具有上述内部属性,并且可以构造它们的唯一方式是通过我之前提到的三种方法,您可以看到内部函数对象是如何创建的{{3 }}

答案 1 :(得分:1)

非常简单。

变量F指向一个函数,因此typeof F返回'function'。

但是F()的返回值是一个对象,一个执行上下文(激活对象),或者一个类的实例(如果需要)。有关此内容的更多信息,请阅读this excellent blog series

因此typeof F()返回'对象'。

正如马丁在评论中所表明的那样;将return new F();更改为return F;。这应该返回一个带有修改范围链的新函数,用于实例化一个新的“子类”。