Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Javascript;“部分类”;使用TypeScript样式的类定义_Javascript_Class_Typescript_Partial Classes - Fatal编程技术网

如何使用Javascript;“部分类”;使用TypeScript样式的类定义

如何使用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

我的应用程序有一个api包装器类,最初是通过在TypeScript中键入并将javascript复制/粘贴到我的应用程序中创建的

因此,def类如下所示:

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 */}
});