Javascript类创建

时间:2012-02-23 10:08:22

标签: javascript javascript-framework

我目前使用这种风格来创建类似结构的js类:

   var JSClass  =   (function(){
       console.log('JSClass Init');
       //-- Set up private var and fnc here
       var opt  =   {
              width:    0,
           height:  60
           }

       function _PrivateSum(g){
           return (g * opt.width);
       }

       //-- Set up public access here
       function JSClass(){ //the class constructor
           //-- class attributes

       }
           //-- class methods
       JSClass.prototype    =   {
           getWidth : function(){
               return _PrivateSum(opt.width);
           },
           setWidth : function(w){
               console.log('JSClass setWidth: ' + w);
               opt.width    =   w;
           },
           getHeight : function(){
               console.log('JSClass getHeight');
               return opt.height;
           },
           setHeight : function(h){
               opt.height = h;
           }

           };

           return JSClass;

   }());

通过在另一页中调用以下内容来启动:

   var jc   =   new JSClass();

这一切都很好等但是如果我需要创建一个我想在同一页面上多次使用的类:       var jc = new JSClass();       var jc2 = new JSClass();

目前,如果我在第一个“jc”内更改任何内容,那么它也会控制第二个“jc2”中的内容。

所以我的问题是我将如何创建一个新的JSClass()类实例,以便我可以单独操作每个实例而不影响当前的实例,类似于php类等

我相信我需要以某种方式创建原始的克隆但不确定,或者如果有比上面更好的方式请随时通知我

非常感谢

3 个答案:

答案 0 :(得分:1)

您的变量(" opt")是 STATIC (类变量 - 即在类的所有实例之间共享)而不是实例变量。实例变量是"这个"的属性。您在构造函数中创建的对象和/或您拥有的两个set(ter)函数。在setWidth中,setHeight用this.width(或height)替换opt.width(或height)并删除静态var" opt"。

此外,将_PrivateSum移动到原型对象中,否则您将无法访问刚刚引入的新实例变量 - 除非您使用_PrivateSum.call(this,this.width)调用它,因为当您现在调用它时#&# 34;这"将是错误的,但如果它是一个实例方法,你用它来调用它._PrivateSum(...)"这个"将指向正确的对象。

答案 1 :(得分:1)

我喜欢使用这样的结构: 注意:没有新陈述。

//definition
var myClass = function() {
    var abc = 1; //private properties

    function f1() {...}; //private methods

    return {
        bar: function() {} //public function *with* access to private members and functions
    };
};

//usage:

var myInstance1 = myClass();
var myInstance2 = myClass();

答案 2 :(得分:1)

所有您的类实例将使用相同的opt对象,因此在一个实例中更改它也将为所有其他实例更改它。

您必须将opt移动到构造函数中。当然,原型功能比松散访问选择。 如果你想使用私有成员的类的功能方法,你必须放弃原型的美丽,继承将是复杂的。但你会得到真正的私人成员。

Crockford的“The Good Parts”是我为这些事情推荐的读物。