gpt4 book ai didi

javascript - 在 JAVASCRIPT 模块模式中定义私有(private)字段成员和继承

转载 作者:行者123 更新时间:2023-11-29 10:20:49 25 4
gpt4 key购买 nike

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

    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 共享相同的私有(private)字段副本(因此实际上它们是静态的)。那么有没有一种方法可以在模块模式中定义私有(private)字段,同时为对象使用相同的函数副本?

对于上面提到的第一个方法的继承,我首先需要在子类中创建一个对象,然后返回该对象。

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

但这实际上只是将 baseClass 的对象包装在 childClass 中,是否有其他方法可以实现相同的方法(对于第一种或第二种方法),以便它可以像真正的 java 继承一样使用 protected 、私有(private)的等方法?

最佳答案

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

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

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

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

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

// usual body, using "this"
}

另外,Child的原型(prototype)直接继承自Parent的原型(prototype)对象。这可以通过 Object.create 完成(需要为旧版浏览器填充):

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

关于javascript - 在 JAVASCRIPT 模块模式中定义私有(private)字段成员和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12463040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com