Javascript 在ext4中使用私有作用域扩展单例?

Javascript 在ext4中使用私有作用域扩展单例?,javascript,singleton,extjs4.1,private-members,Javascript,Singleton,Extjs4.1,Private Members,在ExtJS3到4的迁移过程中,我遇到了一个难题,我想知道是否有人已经解决了:即,如何使用私有范围扩展单例 Ext.define('A', { someMethod: function(){ return 'a'; } }); Ext.define('B', (function(){ var fn = function(){ return 'b'; }; return { extend: 'A',

在ExtJS3到4的迁移过程中,我遇到了一个难题,我想知道是否有人已经解决了:即,如何使用私有范围扩展单例

Ext.define('A', {
    someMethod: function(){
        return 'a';
    }
});

Ext.define('B', (function(){
    var fn = function(){
        return 'b';
    };

    return {
        extend: 'A',

        someMethod: function(){
            return this.callParent() + fn();
        }
    }
})());

console.log(new A().someMethod());
console.log(new B().someMethod());
在Ext3中,我将使用Extend:

Ext.namespace("My.New.Obj");

My.New.Obj = (function() {
    var privateVar = 3;
    function privateFunc() { alert(privateVar); }

    var extendedObj = Ext.extend(My.Other.Obj, {
        newFunc: function() { alert(this.publicVar+privateVar); },
        publicVar: 4
    });

    return new extendedObj();
})();
据我所知,我会使用Ext.define创建一个单例模式,但我不知道如何扩展内部对象

Ext.define('My.New.Obj', function() {
  var privateVar = 3;
  function privateFunc() { alert(privateVar); }

  var extendedObj = Ext.create('My.Old.Obj',{
    newFunc: function() { alert(this.publicVar+privateVar); },
    publicVar: 4
  });

  return extendedObj;
});
上面这个例子唯一的问题是,我认为Ext.extend中保存的超级方法会被覆盖


如何在保持私有范围的同时扩展单例?

太好了,谢谢!我没有意识到extjs4能够识别和解释对象文本中的extend关键字。上面的示例返回一个对象定义(即
function()
),而不是单例。要创建一个单例,您需要在return语句中包含
singleton:true
标志。是否考虑以这样一种方式扩展类(非单例)以便在不同的实例中保持不同的状态?下面提供的Evan的答案正是这样做的。在该示例中,定义了对象或类B。一个简单的定义包括
var b_object=new b()。您可以通过创建一个状态变量来保持该对象的状态:
return{fooVar:3,…}
。如果使用不同的值为
privateInstanceVar
创建实例1和实例2,为什么此示例总是警告“测试2”?
Ext.define('A', {
    someMethod: function(){
        return 'a';
    }
});

Ext.define('B', (function(){
    var fn = function(){
        return 'b';
    };

    return {
        extend: 'A',

        someMethod: function(){
            return this.callParent() + fn();
        }
    }
})());

console.log(new A().someMethod());
console.log(new B().someMethod());