Javascript TypeError:在使用new时不是函数

Javascript TypeError:在使用new时不是函数,javascript,inheritance,constructor,prototype,Javascript,Inheritance,Constructor,Prototype,以下内容不会引起任何错误: Function.prototype.method = function (name, func) { this.prototype[name] = func; }; Function.method('inherits', function (Parent) { this.prototype = new Parent( ); this.prototype.construct = this; }); var p = functio

以下内容不会引起任何错误:

Function.prototype.method = function (name, func) {

    this.prototype[name] = func;

};

Function.method('inherits', function (Parent) {

    this.prototype = new Parent(  );
    this.prototype.construct = this;

});


var p = function(){}
var c = function(){}

c.inherits(p)
但这会引发“TypeError:_a.inherits不是函数”:


据我所知,new的返回值是一个函数。它必须是一个函数,因为它有一个可以使用和分配的原型属性和一个指向自身的构造函数属性。在prototype查找算法中,它应该在Function.prototype中发现“继承”,然后再通过Object.prototype。否?

kid
不是一个函数,它是一个
对象。您可以在此处阅读有关
new
关键字的信息:

以下是基于您的代码的一些用法:

var kid = Child;
kid.inherits(Parent);

var bart = new kid();
bart.say();

首先,new的返回值不是一个函数

使用new关键字调用函数时,将创建一个新对象,并将其分配给构造函数中的“this”,然后返回

另外,创建的对象没有prototype属性。可从以下方面确认:

 alert(typeof kid); // object
   alert(kid['prototype']); //undefined
   alert(kid['constructor'].prototype); //object

我通过这个构造函数属性了解到,原型继承是有效的。

\u a
不是一个
函数
它是一个
对象
,您为js
函数编写了
继承(父)
在函数上调用它,然后从继承的
函数创建新对象

乙二醇-


为什么您认为
inherits
方法存在于
kid
上?@user2357112因为kid是一个函数,而inherits是在function.prototype上创建的,原型查找算法应该在命中Object.prototype之前通过function.prototype。@user2357112只有在使用new关键字时才会失败。如果没有new关键字,则不会抛出错误。new关键字应该返回一个函数,毕竟只有函数有原型属性和指向函数本身的构造函数。在我接受kid是对象而不是函数之前,为什么它有权访问原型属性?只有函数才能使用prototype属性。您可以检查警报结果(typeof kid);它返回对象而不是函数。@编码器是的,我可以这样做,它将返回一个对象。但我的问题仍然是,如果它是一个对象而不是一个函数,那么为什么它能够修改和使用prototype属性呢?要创建原型链,您必须创建一个函数。@JohnMerlino“……那么为什么它能够修改和使用原型属性呢?”。它不能。@sahbeewah bart.prototype.name在我的浏览器中不返回“undefined”,而是类似于obj={};obj.prototype.name可以。obj是一个对象,您不能修改它的prototype属性,但可以修改函数的prototype属性。因此它有一个构造函数属性,指向创建对象的函数,因此您可以通过该函数访问prototype属性。因此,继承就是这样建立起来的。
 alert(typeof kid); // object
   alert(kid['prototype']); //undefined
   alert(kid['constructor'].prototype); //object
        b.prototype.y=function(){ //add y to b
        alert("y from b called");
        }
        a.inherits(b);//inherits function b 
        _a = new a();//create obj from a after inheritence
        _a.y();// call method of b