未捕获的类型错误:未定义不是一个函数
Uncaught TypeError: undefined is not a function
我是一个相当初学者的程序员,所以请原谅我,如果这个解决方案相当简单(尽管我已经努力寻找已经发布的解决方案)。我正在尝试面向对象的编程,但是在第 14 行运行程序"未捕获的类型错误:未定义不是函数"时收到此错误消息。
var Gladiator = Object.create(null);
Gladiator.prototype = {
becomeGladiator: function(attack, defense, hitPoints, name) {
this.attack = attack;
this.defense = defense;
this.hitPoints = hitPoints;
this.name = name;
},
};
var Human = Object.create(Gladiator.prototype);
Human.prototype = {
becomeHuman: function(attack, defense, hitPoints, name) {
this.becomeGladiator(attack, defense, hitPoints, name); //Error here
};
var ethan = Object.create(Human.prototype);
ethan.becomeHuman(14, 12, 15, "Ethan")
谢谢。
>prototype
是函数(构造函数)的属性,用于在创建实例时设置内部[[Prototype]]
属性。 Object.create
采用父对象并创建一个对象,其原型是父对象;您只需要普通对象:
var Gladiator = Object.create(null);
Gladiator.becomeGladiator = function(attack, defense, hitPoints, name) {
this.attack = attack;
this.defense = defense;
this.hitPoints = hitPoints;
this.name = name;
};
var Human = Object.create(Gladiator);
Human.becomeHuman = function(attack, defense, hitPoints, name) {
this.becomeGladiator(attack, defense, hitPoints, name); //Error here
};
var ethan = Object.create(Human);
ethan.becomeHuman(14, 12, 15, "Ethan");
如果你好奇为什么你的代码不起作用,这里有一个简短的解释:
-
ethan
继承自Human.prototype
对象。 -
Human.prototype
继承自Object.prototype
实例,因为它是使用对象的创建文本运算符{}
创建的。 - 所以当你做
ethan.becomeHuman(..)
时,解释器会检查ethan
是否有属性becomeHuman
。它没有。然后,它会在ethan
继承自的对象上检查相同的内容,即Human.prototype
。这个现在确实有一个属性becomeHuman
因此它被调用this
绑定到ethan
的关键字。 - 然后在进一步的执行中
this.becomeGladiator
ethan.becomeGladiator
.现在,ethan
实例没有名为becomeGladiatar
的属性。它继承自Human.prototype
实例,该实例也没有属性becomeGladiator
。Human.prototype
继承自Object.prototype
,它既没有属性becomeGladiatar
赋给它。您已经检查了整个原型(继承)链,但没有成功,这就是您出现错误的原因。
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 我可以在json对象中添加一个函数吗
- Javascript使函数一个接一个地执行
- 是JavaScript中的函数一个对象
- 两个几乎相等的jQuery函数;一个适用于IE,一个不适用于IE
- 两个Javascript函数一个window.onload=Custom.init;和一个window.onload=f
- 使javascript加载函数一个接一个地执行
- 如何通过两个嵌套的匿名函数(一个带有超时的事件处理程序)传递变量
- 为什么我不能让两个jQuery函数一个在另一个里面呢?
- 给函数一个变量名,而不是它的值
- 如何使用嵌入函数(一个滚动页由Pete - peachananr)
- 是否有可能给JavaScript函数一个类型/类?
- 确保两个函数一个接一个地执行,其中第一个函数内部有一个异步调用
- 两个不同的ajax函数一个接一个调用返回相同的值
- jQuery第一次更改函数一个工作
- 给这个函数一个id
- 如何给回调函数一个值一个变量在特定时刻
- 使用回调使两个函数一个接一个地运行
- 两个函数(一个用php)是否可以用“;onclick”;
- 两个几乎相同的函数.一个函数用Queue进行排队.Jquery效果在queued函数上不起作用.为什么