【问题标题】:Javascript constructor, prototype and instantiation. Architecture and FrameworkJavascript 构造函数、原型和实例化。架构和框架
【发布时间】:2013-07-18 12:33:26
【问题描述】:

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

每个模块都有一套通用的初始化规则和通用的函数集。

STEP 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 builder

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


现在的问题...我想在另一个“核心”模块中进行通用构造函数/原型初始化。如果在步骤 2 中我们向原型添加函数,那么它们具有“this”关键字并且可以访问 CURRENT_INTANCE 字段,例如财产1。

但是,如果原型作为变量传递给“defaultScenarioPrototype”构建器,则所有函数都具有 CORE 类的另一个“this”,构建器所在的位置。
我们应该如何将“通用”功能添加到另一个模块的原型中?

【问题讨论】:

  • t.core.defaultScenarioPrototype.call(this,p); 不起作用吗?您可以调用或申请继承:stackoverflow.com/questions/16063394/…
  • @HMR,非常感谢,我会检查一下。还没有打电话和申请的那个肯。
  • @HMR 请将其作为答案发布,这非常有帮助。

标签: javascript architecture frameworks constructor prototypal-inheritance


【解决方案1】:

根据要求,我将添加我的评论作为答案。要在某个 this 上下文中调用函数,您可以使用 Function.prototype.callFunction.prototype.applyFunction.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

人们会假设 bind 使用更少的内存并且速度更快,但我最近在某处读到 bind 实际上比传递闭包要慢,所以我也不确定内存消耗。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多