我有点陷入困境让我的头脑绕过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);
构造函数使用 apply 函数正确创建 mod 的新实例,但它的原型不是原即可。我错过了什么阻止 mod 使用 proto 构建它作为原型?
以下是包含上述代码的fiddle。
谢谢堆!
答案 0 :(得分:1)
.prototype
赋值不适合你的原因是因为只有在构造函数上使用new
运算符时才能设置这样的原型链。
您创建了一个返回新创建对象的工厂函数。摆脱return
中的mod
并使用this
附加您的方法,并在创建new
的实例时使用mod
运算符将.prototype
任务工作。
这可能令人困惑所以我更新了你的小提琴: https://jsfiddle.net/6fdo649y/1/
有几种方法可以实现您的目标,但此示例解释了您没有看到.prototype
工作的原因。
//Constructor function using this
function Mod(arg1) {
this.sayGoodbye = function sayGoodbye() {
alert("Goodbye!");
}
this.saySomethingElse = function saySomethingElse(message) {
alert(message);
}
this.arg1 = arg1;
};
var proto = {
sayHello: function() {
alert("Hello!");
}
};
Mod.prototype = proto;
function construct(constructor, args) {
function constructorWrapper() {
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 === bar);
console.dir(foo);
console.dir(bar);
编辑:通过apply传递了args。