gpt4 book ai didi

javascript - 使用原型(prototype)封装在 JavaScript 中

转载 作者:行者123 更新时间:2023-11-29 17:06:14 25 4
gpt4 key购买 nike

可能你们中的许多人都尝试过在 JavaScript 中实现封装。我知道的两种方法是:

我想更常见一点:

var myClass(){
var prv //and all private stuff here
//and we don't use protoype, everything is created inside scope
return {publicFunc:sth};
}

第二个:

var myClass2(){
var prv={private stuff here}
Object.defineProperty(this,'prv',{value:prv})
return {publicFunc:this.someFunc.bind(this)};
}
myClass2.prototype={
get prv(){throw 'class must be created using new keyword'},
someFunc:function(){
console.log(this.prv);
}
}
Object.freeze(myClass)
Object.freeze(myClass.prototype)

因此,由于第二种选择对我来说更方便(特别是在我的情况下,因为它在视觉上将构造与工作流分开),问题是 - 在这种情况下是否存在任何严重的缺点/漏洞?我知道它允许外部代码通过

访问 someFunc 的参数
myClass.protoype.someFunc.arguments

但仅在草率执行回调的情况下(在调用链内同步)。使用 setTimeout(cb,0) 调用它们会中断链并不允许获取参数以及仅同步返回值。至少据我所知。

我错过了什么吗?这一点很重要,因为外部不受信任的用户提供的代码将使用代码。

最佳答案

我喜欢将我的原型(prototype)包装在一个返回对象的模块中,这样您就可以将模块的作用域用于任何私有(private)变量,从而保护您的对象的使用者不会意外地弄乱您的私有(private)属性。

var MyObject = (function (dependency) {

// private (static) variables
var priv1, priv2;

// constructor
var module = function () {
// ...
};

// public interfaces
module.prototype.publicInterface1 = function () {
};

module.prototype.publicInterface2 = function () {
};

// return the object definition
return module;

})(dependency);

然后在其他文件中你可以正常使用它:

obj = new MyObject();

任何更多的“保护”您的对象对于 JavaScript imo 来说都有些矫枉过正。如果有人想要扩展您的对象,那么他们可能知道他们在做什么,您应该允许他们!

正如 redbmk 指出的那样,如果您需要私有(private)实例 变量,您可以使用以对象的某些唯一标识符作为键的映射。

关于javascript - 使用原型(prototype)封装在 JavaScript 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24493391/

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