Javascript构造函数、原型和实例化.架构和框架

Javascript constructor, prototype and instantiation. Architecture and Framework

本文关键字:框架 实例化 Javascript 原型 构造函数      更新时间:2023-09-26

我正在开发一个"框架",并发现自己正在编写模块。

对于每个模块存在一组通用初始化规则和一组通用函数。

步骤1。构造函数:

var ns = "namespace1";
t.scenarios[ns] = function (container, instanceName, options) {
    // common for all scenarios, e.g. options initialization
    t.core.defaultScenarioConstructor(this, ns, container, instanceName, options)
    // things only for NAMESPACE1
    this.PROPERTY1 = 1;
}

第2步。(与问题相关)然后我有一个的原型

var p = t.scenarios[ns].prototype;
p.newfunction = function(){
    this.PROPERTY1; // accessible
} 

其中填充了THINGS_ONLY_FOR_NAMESPACE1

t.core.defaultScenarioPrototype(p);

步骤3/4。实例化类(使用new关键字)&调用dom生成器

p.initNewView = function(container) {/* build dom and assign handlers*/}


现在的问题是。。。我想在另一个"核心"模块中进行常见的构造函数/原型初始化。如果在第2步中,我们将函数添加到原型中,那么它们具有"this"关键字,并且可以访问CURRENT_INTANCE字段,例如PROPERTY1。

然而,如果原型作为变量传递给"defaultScenarioPrototype"构建器,那么所有函数都有CORE类的另一个"this",构建器就在这里。
我们应该如何将"通用"函数添加到来自另一个模块的原型中?

根据请求,我将添加我的评论作为答案。要在特定的this上下文中调用函数,可以使用function.prototype.call、function.protoype.apply或function.prototype.bind.

在传递回调而不想使用闭包的情况下,经常使用绑定:

setTimeout(myOjbect.somefunction,100);//this in somefunction is window
setTimeout(function(){
  myObject.somefunction();
},100);//this in somefunction is myObject but a closure is created
setTimeout(myObject.somefunction.bind(myObject),100);//this is myObject 
                                    //and no closure is created

有人会认为绑定使用的内存更少,速度更快,但我最近在某个地方读到绑定实际上比传递闭包慢,所以我也不确定内存消耗情况。