javascript中的实时对象创建和部分拆卸管理是如何工作的?

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

本文关键字:何工作 工作 管理 对象 实时 创建 javascript      更新时间:2023-09-26

我想做的是加载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/}}"的未初始化状态。我的应用程序/库以这种方式有一个存根和一个链接,可以从一个未定义的状态立即使用,当构建模块时,这对于降低对实用程序的引用数量是有用的,比如一个帖子有一个函数菜单,这些函数由所有帖子共享,—使用这里描述的机制,只有"活动帖子"/"焦点帖子"将引用实用程序。它不仅提供激活和取消激活模块的能力。特殊的部分是模块已经预热了,它们已经准备好调用函数了,即使它们还没有引用它们,它类似于实时绑定,但允许整个用户界面已经定义了已经存根的函数,当它们可用时将具有确切的名称。对我来说,在这个模型中很容易找到默认值和脱线的控制机制。

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

最好的方法将允许你拆除一个对象,释放它的函数和成员在堆上消耗的空间,并保持一个单独的引用,这将允许对象重建自己或只是重建被调用的函数,就像这样-(一个非常简单的模型,你可能喜欢使用数组并逐渐拆除内部嵌套的对象):

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弱引用会改变它的外观,但是不会解决这个问题中提到的所有问题。当通过某种类型的深度观察者添加属性时,重新映射对象将允许在设置新属性成员时对其进行增强,这将要求观察者在设置属性时同步运行,或者一旦设置完成,下一个语句必须是一个更新对象的调用。我将继续在这里发布任何进展,我看到将使"默认处理函数"在javascript中可用的未来。

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

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