使用 Function.apply() 构造一个带有原型的对象
Construct an object with a prototype using Function.apply()
我对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.prototype = 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 的新实例,但它的原型不是原型。我缺少什么来阻止模组以原型作为原型构建?
这是对上述代码的小提琴。
谢谢堆!!
.prototype
赋值不适合您的原因是,仅当您在构造函数上使用 new
运算符时,才能像这样设置原型链。
您创建了一个返回新创建对象的工厂函数。摆脱mod
中的return
并使用this
附加方法,并在创建mod
实例时使用new
运算符将使.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);
已编辑:在传递参数时添加了应用。
相关文章:
- Node.js中的JavaScript原型对象效率
- 获取原型对象的名称
- 如何维护对原型对象的访问
- 文字与原型对象表示法的数据结构
- 使用原型对象向javascript对象添加自定义属性和方法的建议
- 正在重置原型对象的构造函数属性
- 编写JS原型时,所有函数都应该使用原型对象
- 什么's是原型对象的真实名称
- Javascript - 使用数组作为函数的参数,并在创建新的原型对象时更改值
- 在原型对象 jquery 上将一个按钮与另一个按钮不同
- 原型对象
- 循环遍历数组时的原型对象
- 为什么初始化的 JavaScript 对象不包含原型对象
- JavaScript 原型对象 - 如何访问继承
- Javascript:获取此原型对象名称
- 如何在数据绑定后在 KNOCKOUT js 中使用“with”访问另一个原型对象
- 这在 JavaScript 中的原型对象中的值
- 在主干中向原型对象添加值不起作用
- 删除函数原型对象
- 为什么当我在这个JavaScript对象上使用反射时,我可以'看不到在其原型对象中定义的属性