【发布时间】:2014-05-08 16:43:15
【问题描述】:
不确定是什么问题。我很确定我理解原型继承应该如何工作。本质上,我想让一个 javascript 对象可以从其原型继承属性/函数引用,其好处是能够从子对象调用函数,而无需将该函数重写到对象本身。
我的对象是:
function Animation(animationArguments) {
Object.defineProperty(this, 'successfullyDuplicatedFunction', {
value: function(){},
enumerable : false
});
}
Animation.prototype.gather = function() {}
repeatable.prototype = new Animation();
function repeatable(repeatableArguments) {
Animation.call(this, repeatableArguments);
}
var createdObject = new repeatable(argumentsToPass);
createdObject.gather(); //throws Uncaught TypeError: Object #<repeatable> has no method 'gather'
createdObject.successfullyDuplicatedFunction(); //successfully calls
现在,这就是我感到困惑的地方。理论上,我应该可以调用repeatable.gather() 来引用动画的函数gather。但是,控制台一直告诉我它没有方法收集。奇怪的是(而且我对奇怪的程度并不肯定),javascript告诉我我正在创建的对象(可重复)有一个 proto:repeatable 构造函数是'函数可重复'并带有 proto:对象。动画对象发生了什么?此外,更奇怪的是它成功复制了“successfullyDuplicatedFunction”并将其列为我可以调用/引用的不可枚举属性。
如果有帮助,我会在 google chrome 中进行我的主要开发。
谁能解释得更清楚一点?我已经查看了对 javascript 原型的许多不同解释,并经历了这段代码的许多不同迭代,试图让它按照我假设原型应该工作的方式工作。所以这里应该怪我的理解……请赐教?
【问题讨论】:
-
给定您的代码,
...has no method 'gather'没有错误。有一个错误argumentsToPass is not defined,但一旦修复,就没有错误了。 jsfiddle.net/FH6Nz -
好的,显然需要更多代码才能给出完整的答案,因为我的工作代码肯定有这个问题。我刚刚挑选出我认为很重要的部分在这里发布。至少我知道我正确理解了原型(理论上)。如果它真的是正确的,也许我应该用更多的代码重新发布?
-
您应该整理一个最小但完整的示例,完全代表您遇到的问题,然后更新您的问题。
-
这就是……没错。我唯一遗漏的是我的动画创建者,它只是解析一个数组并将对象创建路由到所需的对象创建函数。 (基本上是在要创建的动画子类型之间进行选择)。
-
所以贴出来。无论您遗漏什么,都必须是问题的一部分。同样,除了未声明的变量之外,您发布的代码没有问题。
标签: javascript function inheritance methods prototype