定义在JavaScript模块模式私人领域成员和继承(Define Private field Me

2019-06-18 04:43发布

我可以使用下面的代码定义在模块图案私有成员字段

    var myClass = function(){
       var private_field1,private_field_2;
       var private_func1 = function(){
            //.......
       } 
       //.........
       var myObj = {
         global_field1:2,
         global_field2:"something",
         global_func: function(){//......} 
       }
       return myObj;
    };
   var obj = myClass();

此方法效果不错,但这个问题的问题是,每当我创建一个新的对象被创建并加载到内存中的所有功能副本(不象Java其中同一类份额相同功能的存储器中的所有对象)

我试着用下面的另一种方法:

 var myClass = (function(){
           var private_field1,private_field_2;//private static fields
           var private_func1 = function(){
                //.......
           } 
           //.........
           var Constr = function(){
             //do something
           }
           Constr.prototype = {
             //................
             global_func: function(){//......} 
           }
           return Constr;
    }());
var obj1 = new myClass();
var obj2 = new myClass();

但是,使用这种方法的问题是明显OBJ1,私人领域的obj2的份额相同的副本(所以有效它们是静态的)。 那么,有没有一种方式,同时使用的功能相同的副本的对象定义模块模式私有字段?

并继承了上述第一种方法,我首先需要创建子类中的对象,然后返回该对象。

 var ChildClass = function(){
      var childobj = myClass();
      //override or add functions to childobj
      return childobj ;
 }

但是,这只是有效的包装基类的childClass对象,是否有实现相同(为第一或第二的方法),以便它可以像与保护,私有等方法真正Java继承一些其他的方式?

Answer 1:

第私有性在JavaScript只能通过作用域(:关闭,并从中导出)来完成。

需要访问私有变量(和函数)的功能,被称为特权方法需要在构造函数中进行定义。 不(只具有公共属性或其他方法进行交互),这些方法应该原型对象上定义,所以你会得到最终的混合方法。 可能你刚发现的静态值相结合。

顺便说一句,而不是函数[代码]本身被拷贝并且存储多次。 只有不同范围的对象(词法环境)需要存储。

继承通常不是通过创建父对象和扩展他们,但通过创建子实例,并像父母扩展它们完成。 这是可以这样做应用的父类的构造新创建的孩子:

function ChildClass() {
    ParentClass.call(this, /* … arguments */);

    // usual body, using "this"
}

此外,儿童的原型来自父母的原型对象直接继承。 这可以通过来完成的Object.create (需匀为传统的浏览器):

ChildClass.prototype = Object.create(ParentClass.prototype, {
    constructor: {value:ChildClass}
});


文章来源: Define Private field Members and Inheritance in JAVASCRIPT module pattern