如何使用Javascript;“部分类”;使用TypeScript样式的类定义
我的应用程序有一个api包装器类,最初是通过在TypeScript中键入并将javascript复制/粘贴到我的应用程序中创建的 因此,def类如下所示:如何使用Javascript;“部分类”;使用TypeScript样式的类定义,javascript,class,typescript,partial-classes,Javascript,Class,Typescript,Partial Classes,我的应用程序有一个api包装器类,最初是通过在TypeScript中键入并将javascript复制/粘贴到我的应用程序中创建的 因此,def类如下所示: var SiteApi = (function () { function SiteApi(initially) { //stuff } SiteApi.prototype.method1 = function(){/*stuff*/}; SiteApi.prototype.method2 = function
var SiteApi = (function () {
function SiteApi(initially)
{
//stuff
}
SiteApi.prototype.method1 = function(){/*stuff*/};
SiteApi.prototype.method2 = function(){/*stuff*/};
return SiteApi;
})();
现在,当它们位于admin页面时,我想添加一个额外的admin.js文件,该文件将包含admin方法。比如说
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() {
...
}
所以我想还需要一行代码将管理功能绑定到其中
注意,我可以使用类似于SiteApi.admin_method1
的方法,但问题是,对于TypeScript样式的类,原型在定义中定义,并且对象被执行,因此以后如何添加更多原型似乎并不简单。选项1
扩展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));
选择2
让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;
}());
选择3
SiteApi
的原型仍然是公开的,如果您不需要进行更多的构建,只需要使用新方法,只需将它们添加到admin.js中即可
最后一个选项是唯一会影响在加载admin.js之前创建的SiteApi实例的选项
当然,您也可以将选项2和3混合在一起。类似地,您可以使用选项1,但可以使用不同的名称调用新构造函数,而不是像AdminApi一样隐藏原始构造函数,并在管理页面上使用该名称而不是SiteApi。选项1
扩展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));
选择2
让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;
}());
选择3
SiteApi
的原型仍然是公开的,如果您不需要进行更多的构建,只需要使用新方法,只需将它们添加到admin.js中即可
最后一个选项是唯一会影响在加载admin.js之前创建的SiteApi实例的选项
当然,您也可以将选项2和3混合在一起。类似地,您可以使用选项1,但可以使用不同的名称来调用新构造函数,而不是像AdminApi那样隐藏原始构造函数,并在管理页面上使用该名称而不是SiteApi。我看到一个在IIFE中编写的普通构造函数。这就是你说的“打字风格”吗?此外,管理员是要向原型引入更多内容,还是只是进行更多的构建?@PaulS。我听说TopeScript类风格是2种不同模式的混合,因为它把原型放在中间,有一个名为类的构造函数,并且在定义时执行“定义”。如果这是生活,那么是的。根据使用情况,TypeScript可能遵循多种形式。但上面的内容正是我们所拥有的,它的类型脚本的起源与此无关。我看到一个普通的构造函数是在IIFE中编写的。这就是你说的“打字风格”吗?此外,管理员是要向原型引入更多内容,还是只是进行更多的构建?@PaulS。我听说TopeScript类风格是2种不同模式的混合,因为它把原型放在中间,有一个名为类的构造函数,并且在定义时执行“定义”。如果这是生活,那么是的。根据使用情况,TypeScript可能遵循多种形式。但是上面的内容正是我们所拥有的,而且它的类型脚本来源是不相关的。如果管理函数不需要构造,并且siteapi.js和Admin.js是异步加载的(siteapi构造不依赖于管理函数),那么设置Admin.js的最佳方法是什么,这样即使先加载它也可以工作?:)我可以保证在加载两个Javascript之前不会调用api=new SiteApi()。我所说的“工作”并不意味着你可以在加载siteapi.js之前调用管理函数,但它们最终会出现在siteapi原型中。如果你想在siteapi.js上构建,则必须在siteapi.js之后调用admin.js中的代码,我只是想知道是否有比setTimeout检查另一个是否存在更好的方法。如果管理函数不需要构造,并且siteapi.js和Admin.js是异步加载的(siteapi construction不依赖于管理函数),那么设置Admin.js的最佳方法是什么,因此,即使先加载,它也会工作吗?:)我可以保证在加载两个Javascript之前不会调用api=new SiteApi()。我所说的“工作”并不是说你可以在加载siteapi.js之前调用管理函数,而是说它们最终会出现在siteapi原型中。如果你想在siteapi.js上构建它,则必须在siteapi.js之后调用admin.js中的代码。我知道,我只是想知道是否有比setTimeout更好的方法来检查另一个是否存在。
Object.assign(SiteApi.prototype, {
admin_method1: function () {/* admin stuff through prototype */},
admin_method2: function () {/* more admin stuff through prototype */}
});