不确定问题所在。我很确定我理解原型继承应该如何工作。本质上我想让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()来引用动画的函数集合。但是,控制台一直告诉我它没有方法收集。奇怪的是(并且我并不喜欢奇怪的程度),javascript告诉我我正在创建的对象(可重复)有一个 proto :可重复的,它的构造函数是'function repeatable'并使用 proto :Object。动画对象发生了什么?此外,更奇怪的是它成功复制了'successfulDuplicatedFunction'并将其列为我可以调用/引用的非可枚举属性。
如果有帮助的话,我会在谷歌浏览器中进行主要开发。
任何人都可以更清楚地解释一下吗?我已经查看了javascript原型的许多不同解释,并经历了许多不同的代码迭代,试图让它工作,我假设原型应该工作。所以这可能是我理解的责任......开导我?
答案 0 :(得分: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确实支持属性委派和多重继承,但构造函数模式却不支持。