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