【问题标题】:Javascript prototype not inheriting functions... or prototype?Javascript原型不继承函数......或原型?
【发布时间】: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


【解决方案1】:

所以,问题不在于我对原型的理解,而在于 javascript 的构造函数与原型继承相关的实现。我试图——没有意识到——创建一个通过我的function that routes the object creation to the object creation function required 定义多重继承的构造函数。理想情况下,它会通过多个原型来构造一个继承自多个原型的对象。原型继承支持这一点,但 javascript 的伪构造函数模式不支持。为了解决这个问题,我创建了一个构造函数来解析这些参数并将对象部分路由到唯一的原型构造函数。

我的目标是原型属性委托,但不知道如何正确创建一个动态的对象,该对象继承了多个原型,同时保持原型链完好无损。我得到的是一个 frankensteined 对象,其原型是构造函数本身。而且因为它的原型不是它需要的原型,尝试通过委托someobject.prototype.fire = function(){}; 继承函数不起作用,因为该对象虽然继承了串联的属性function someobject(Arguments) { this.property = arguments;},但它不是“技术上”的对象原型。不幸的是,似乎大多数 javascript 学习资源都将构造函数/原型模式紧密联系在一起,甚至从不费心解释为什么构造函数不能真正有利于原型继承。 Except for this great article.

我得到了原型链,因为它从构造函数本身继承了它的原型,这是一个简单的函数,因此是一个简单的对象。尽管 javascript 确实支持属性委托和多重继承,但构造函数模式不支持。

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2010-09-28
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多