javascript 中的活动对象创建和部分拆卸管理如何工作?

How does live object creation and partial teardown management work in javascript?

我想做的是加载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);

这只是伪代码。如果我添加一个清理方法,那么我可以 return 该对象进入“{**handleAll:function(){/noContext/}} 的未初始化状态。我的 application/library 有一个存根和一个 link 这样可以在未定义状态下立即使用,在构建模块时这对于减少对实用程序的引用数量很有用,比如 post 有一个功能菜单,这些功能由所有 post 共享,-- 使用此处描述的机制,只有 "active post"/"post in focus" 将引用公用事业。它还提供激活和停用模块的能力。特殊的部分是模块已经预热,它们已经准备好调用函数,即使它们还没有引用它们,它类似于实时绑定但允许整个用户界面已经被定义为已经用确切的函数存根他们将在可用时使用的名称。我很容易在这个模型中找到默认值和去抖动的控制机制。

我的问题是:这种类型的脚本在本地是否可行,还是我必须使用某种形式的编译,如 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

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

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);

另外请注意,您可以使用 getters 和 setters 来观察对属性的访问,并且可以在内部呈现函数和属性的外观,这些外观引用构建方法,例如上面,这样看起来你正在访问对象的合法成员。我能想到没有任何选项可以让您在尝试在对象上设置新的 属性 时进行拦截,例如:myObj.fooProperty = "foo",并建立 属性到带有 getter 和 setter 的自定义对象中,如果您有需要设置的自定义类型,那么您必须知道它的实现细节才能设置它,或者调用传入的函数属性 名称和值,或使用与上面所示类似的方法。

这是对 javascript 添加弱引用的提议的 link:https://ponyfoo.com/articles/weakref weak-references 会改变它的外观,但不会解决这个问题。当通过某种类型的深度观察者添加 属性 时重新映射对象将允许新的 属性 成员在设置时得到增强,这将需要观察者 运行 同步时属性 已设置,或者设置完成后,下一个语句必须是更新对象的调用。我会在这里发布我看到的任何进展,这些进展将使 "default handler function" 将来在 javascript 内可用。

WeakRef绝对可以用来记录和处理对象的使用。我真的很想将对象管理转移到网络工作者和服务工作者中,这样它们就可以通过 domain 上的所有网络端点进行维护,并且不需要跨请求重新加载。 Web 框架需要修改句柄以将所有 dom 更改和更新卸载到 worker,本质上是一个处理所有挂钩的消息传递的挂钩。 Modload,现在必须包含消息句柄名称并具有任务优先级元数据,以便将其正确放置在最不忙或最不活跃的工作人员(慢工作人员和快工作人员)中,这有助于创建可以卸载到云的 api功能,这个 shpuld 使我们能够做更多的人工智能,查找和离线工作,这是目前在云中处理的大多数应用程序处理能力更强的地方,这样我们就可以优雅地增加本地处理与云功能只有当本地资源,或完成时间低于可接受的速度,或高于可接受的电源策略。

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