【发布时间】:2016-02-25 04:53:29
【问题描述】:
在了解 JS 的原型继承时,我有点进退两难。我想做的是:
-
定义一个名为mod的对象
var mod = function() { function sayGoodbye() { alert("Goodbye!"); } function saySomethingElse(message) { alert(message); } return { sayGoodbye: sayGoodbye, saySomethingElse: saySomethingElse }; }; -
定义一个名为proto
的原型对象var proto = { sayHello: function() { alert("Hello!"); } }; -
将mod的原型设置为proto
mod.prototype = proto; -
使用 proto 原型调用构造 mod 新实例的函数
function construct(constructor, args) { function constructorWrapper() { return constructor.apply(this, args) } constructorWrapper.prototype = constructor.prototype; return new constructorWrapper(); } var foo = construct(mod, ["Other Message 1"]); var bar = construct(mod, ["Other Message 2"]); console.dir(foo); console.dir(bar);
construct 函数使用 apply 函数正确地创建了一个新的 mod 实例,但它的原型不是 proto >。我错过了什么阻止 mod 被构造为 proto 作为它的原型?
这是带有上述代码的fiddle。
谢谢大家!!
【问题讨论】:
-
您的
mod函数是一个返回对象的工厂。不应该,它应该是初始化this上的属性的构造函数(或方法)。 -
我想知道你为什么不直接使用
new mod("Other message 1")? -
@squint:我猜第 4 步应该设置原型链。如果
constructorWrapper或constructor没有返回对象,它甚至会返回。 -
@Bergi:哦,我明白了。他只是在搬运它。编辑:我错过了他实际上是在分配功能。不知何故,我将其视为 IIFE。我希望人们尽可能使用函数声明。
-
太棒了@squint。感谢您的帮助!
标签: javascript inheritance constructor prototype instance