0

我想做的是加载javascript以在对象中创建一个方法库,并等到该对象第一次被使用,然后再实际定义或编译。我想在这个对象被完全定义之前建立对它的引用。当我在对象上的方法被定义之前第一次调用这个对象上的方法时(意味着对象实际上没有方法),我想定义对象然后调用该方法。如果对象上尚未定义“sayHello()”,有没有办法使用诸如“MyLibrary.sayHello()”之类的标准语法来做到这一点。我想它看起来像这样:

var independentVar = "noCommitments";
var MyLibrary = function(user_ini){
    //MyLibrary.init looks like
    // (function(ini){
    //     var a = ini; 
    //     return function(){
    //         //Notice the method sayHello defines when called,
    //         // and does not return a reference
    //         return {
    //             b:a,c:"c",sayHello:function(z){return "Hello"+a+z}
    //         }
    //     }
    // })(user_ini);
    var d1 = myRequire("MyLibrary.init");
    return {
        **handleAll : function(){ this = d1(); this.("**calledMethod")}
    }
};

var greeting = MyLibrary.sayHello();

alert(greeting);

这只是伪代码。如果我添加一个清理方法,我可以将该对象返回到未初始化状态“{**handleAll:function(){/ noContext/}}”。我的应用程序/库以这种方式有一个存根和一个链接,可以在未定义状态下立即使用,在构建模块时,这对于减少对实用程序的引用数量很有用,比如帖子有一个功能菜单,这些功能由所有帖子共享, - 使用此处描述的机制,只有“活动帖子”/“焦点帖子”将引用该实用程序。更不用说激活和删除的能力-activate modules. 特殊的部分是模块已经预热,即使它们还没有引用它们,它们也准备好调用函数,它类似于实时绑定,但允许整个用户界面已经用已经存根的函数定义使用它们可用时的确切名称。对我来说,在这个模型中很容易找到默认和去抖动的控制机制。

我的问题是:这种类型的脚本是否可以在本地使用,或者我是否必须使用某种形式的编译,例如 TypeScript、CoffeeScript 或其他。我知道如果我将我想调用的方法作为参数传递给单例工厂,这是可能的。我最终希望整个应用程序能够优雅地降级未使用的功能而不会污染代码。

我所说的污染是什么意思:

var LibDef = (
function(){
    return {
        callUndefined:function(methodName){
            var returnVal = {}
        }
    }
})()

var MySingltonLibrary = moduleSinglton.getLibrary("MyLibrary", Lib);
var greeting = MySingltonLibrary.callUndefined("sayHello");
//
// Please use your imagination to consider the complexity in the singlton
4

1 回答 1

0

允许您拆除对象释放其函数和成员在堆上消耗的任何空间并维护单个引用的最佳方法,这将允许对象重建自身或重建被调用的函数,就像这样 - (一个非常简单的模型,您可能喜欢使用数组并在内部逐渐拆除嵌套对象):

var twentySecondObj(function(window,document){
    var base_obj = undefined;
    var externalAPI = undefined;
    setTimeout(function(){
        base_obj = undefined;
    },20000);
    return function(){
        base_obj = (function(base_obj){
            if(base_obj === undefined){
                return {
                    property1:"This is property1",
                    property2:"This is property2"
                }
            }
        })();
        externalAPI = (function(){
            if(externalAPI === undefined){
                return {
                    property1:base_obj.property1,
                    property2:base_obj.property2
                }
            }
        })();
        return externalAPI;
    }
})(window,document);

console.log(twentySecondObj().property1);

另外需要注意的是,您可以使用 getter 和 setter 来观察对属性的访问,并且可以在内部呈现引用上述构建方法的函数和属性的外观,这样看起来您正在访问的合法成员目的。我想不出任何选项可以让您在尝试在对象上设置新属性时拦截:myObj.fooProperty = "foo",如果您使用 getter 和 setter 将该属性构建到自定义对象中有一个需要设置的自定义类型,那么你必须知道它的实现细节来设置它,或者调用一个传递属性名称和值的函数,或者使用类似于上面显示的方法。

以下是添加对 javascript 的弱引用的提案的链接:https ://ponyfoo.com/articles/weakref weak-references 会改变它的外观,但不会解决这个问题中提到的所有内容。当通过某种类型的深度观察者添加属性时重新映射对象将允许在设置新属性成员时对其进行增强,这将要求观察者在设置属性时同步运行,或者一旦设置完成,下一条语句必须是更新对象的调用。我将在此处继续发布我看到的任何进展,这些进展将使将来在 javascript 中可用的“默认处理程序函数”。

WeakRef 绝对可以用于记录和处理对象的使用。我真的很想将对象管理转移到 webworkers 和 service worker 中,这样它们就可以通过域上的所有 web 端点进行维护,并且不需要跨请求重新加载。Web 框架需要修改句柄以将所有 dom 更改和更新卸载到 worker,本质上是一个处理所有钩子的消息传递的单个钩子。Modload,现在必须包含消息句柄名称并具有任务优先级元数据,以便将其正确放置在最不忙或最不活跃的工作人员(慢工作人员和快速工作人员)中,这有助于创建一个可以卸载到云功能的 API,这 shpuld让我们能够进行更多的人工智能、查找和离线工作,目前这些都是为云中的大多数应用程序处理的,这些应用程序具有更多的处理能力,

https://v8.dev/features/weak-references

于 2017-02-12T10:39:05.260 回答