我可以使用下面的代码在模块模式中定义私有成员字段
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继承? / p>
答案 0 :(得分:4)
没有。 JavaScript中的私有性只能通过范围界定(并从中导出:闭包)来完成。
需要在构造函数内部定义那些需要访问私有变量(和函数)的函数,称为特权方法。那些没有的方法(只与公共属性或其他方法交互)应该在原型对象上定义,因此最终会得到一个混合方法。可能与您刚刚发现的静态值相结合。
顺便说一句,不是函数[code]本身被复制和记忆多次。只需要存储不同的范围对象(词汇环境)。
继承通常不是通过创建父对象并扩展它们来完成的,而是通过创建子实例并像父对象一样扩展它们来完成的。这可以通过applying新创建的子节点上的父节点构造函数来完成:
function ChildClass() {
ParentClass.call(this, /* … arguments */);
// usual body, using "this"
}
此外,Child的原型直接从Parent的原型对象继承。这可以通过Object.create完成(需要为旧版浏览器填充):
ChildClass.prototype = Object.create(ParentClass.prototype, {
constructor: {value:ChildClass}
});