Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JAVASCRIPT模块模式中定义私有字段成员和继承_Javascript_Oop_Inheritance_Private Members_Module Pattern - Fatal编程技术网

在JAVASCRIPT模块模式中定义私有字段成员和继承

在JAVASCRIPT模块模式中定义私有字段成员和继承,javascript,oop,inheritance,private-members,module-pattern,Javascript,Oop,Inheritance,Private Members,Module Pattern,我可以使用下面的代码在模块模式中定义私有成员字段 var myClass = function(){ var private_field1,private_field_2; var private_func1 = function(){ //....... } //......... var myObj = { global_field1:2, global

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

    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中包装baseClass的对象,是否有其他方法实现相同的功能(对于第一个或第二个方法),以便它可以像真正的java继承一样使用受保护、私有等方法?

否。JavaScript中的私有性只能通过作用域(并从它们导出:闭包)来实现

那些需要访问私有变量(和函数)的函数(称为特权方法)需要在构造函数中定义。那些不需要的方法(只与公共属性或其他方法交互)应该在prototype对象上定义,因此最终会得到一种混合方法。可能与您刚刚发现的静态值相结合

顺便说一句,不是函数[代码]本身被多次复制和记忆。只需要存储不同的范围对象(词汇环境)

继承通常不是通过创建父对象并扩展它们来实现的,而是通过创建子实例并像父对象一样扩展它们来实现的。这可以由父级的构造函数在新创建的子级上完成:

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

    // usual body, using "this"
}
此外,子对象的原型直接从父对象的原型对象继承。这可以通过以下方式完成(传统浏览器需要填充):


第一种方法有效吗?是的-尽管我会创建完整实例而不是返回对象文本…而且继承不适用于
。如果您返回对象(仅提及)的可能副本,请调用

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