我的应用程序有一个api包装类,最初是通过在TypeScript中输入并将javascript复制/粘贴到我的应用程序中创建的。
所以类def看起来像这样:
var SiteApi = (function () {
function SiteApi(initially)
{
//stuff
}
SiteApi.prototype.method1 = function(){/*stuff*/};
SiteApi.prototype.method2 = function(){/*stuff*/};
return SiteApi;
})();
现在当他们在管理页面上时,我想添加一个包含管理员方法的额外admin.js文件。例如
SiteApi.prototype.Admin.method1 = function(){/*stuff*/};
我找到了一个例子来做"最终结果"我想要的:
// file main
function SomeObject() {
for (var i = 0, ii = SomeObject.Partial.length; i < ii; i++) {
SomeObject.Partial[i].apply(this, arguments);
}
}
SomeObject.Partial.SomeName = function() {
...
}
// file extra
SomeObject.Partial.SomeOtherName = function() {
...
}
(来自:Is it possible to give javascript partial class behavior like C# or monkey patching like Ruby does?)
但是,他们使用的类定义类型不同。
如何保留TypeScript样式类定义,并执行类似于此示例的操作以添加管理功能?
作为参考,我们使用我们的类:
siteApi = new SiteApi();
所以我想也需要有一行代码将管理功能绑定到它中。
注意,我可以使用类似SiteApi.admin_method1
之类的东西,但问题是使用TypeScript样式类,原型在定义中定义并且对象被执行,所以它看起来并不像直截了当如何在以后添加更多原型。
答案 0 :(得分:4)
延长SiteApi
但隐藏原件,例如你的 admin.js 加载后会包含类似
SiteApi = (function (old_SiteApi) {
function SiteApi() {
old_SiteApi.apply(this, arguments);
// further construction
this.admin_method1 = function () {/* some admin instance method */};
}
SiteApi.prototype = Object.create(old_SiteApi.prototype);
// add more prototype things
SiteApi.prototype.admin_method2 = function () {/* admin stuff through prototype */},
return SiteApi;
}(SiteApi));
让SiteApi
知道以后需要更多内容,例如原定义将成为
var SiteApi = (function () {
function SiteApi(initially) {
//stuff
var i;
for (i = 0; i < SiteApi.Extras.length; ++i) {
SiteApi.Extras[i].apply(this);
}
}
SiteApi.Extras = [];
SiteApi.prototype.method1 = function () {/* stuff */};
SiteApi.prototype.method2 = function () {/* stuff */};
return SiteApi;
}());
然后 admin.js 会做
SiteApi.Extras.push(
function () {
// stuff to make `this` into an Admin object
this.admin_method1 = function () {/* some admin instance method */};
}
);
SiteApi
的原型仍然暴露,如果您不需要做更多的构建,只需要新的方法,您只需将它们添加到 admin.js < / em>的
Object.assign(SiteApi.prototype, {
admin_method1: function () {/* admin stuff through prototype */},
admin_method2: function () {/* more admin stuff through prototype */}
});
最后一个选项是影响 admin.js 加载之前创建的 SiteApi 实例的唯一选项。
当然,您也可以将选项2和3混合在一起。类似地,您可以使用选项1但是将新构造函数调用为不同的名称而不是隐藏原始构造函数,例如 AdminApi ,并在管理页面上使用它而不是 SiteApi 。