gpt4 book ai didi

javascript - 用JavaScript封装,存在吗?

转载 作者:行者123 更新时间:2023-11-30 07:02:20 25 4
gpt4 key购买 nike

我有使用 C# 编程语言的经验,但我现在还必须使用 JS,这对我来说是相当新的。

我曾尝试在 JS 中开发一个简单的类模拟,如下所示:

http://jsfiddle.net/T74Zm/

function A( inputValue ) {
this.Init( inputValue );
this.Print();
}
A.prototype = {
value: null,
Init: function( inputValue ) {
this.value = inputValue;
},
Print: function () {
console.log( this.value );
}
}

var obj = new A(40);

我试图将变量value封装在A.prototype中,但似乎所有对象都是可用的JavaScript规范。

所以我的问题是:

1).如何进行封装,使其非常接近具有 OOP/访问修饰符支持的静态语言?

2).我如何在 JS 中模拟一些访问修饰符,例如 private

最佳答案

如果你想使用继承,你不能(至少 AFAIK)。对于没有继承链的对象,您可以使用闭包来获得完全相同的效果。问题是您是否真的需要属性实际上是完全私有(private)的。

闭包方法

您可以执行一个函数,其闭包包含您想要私有(private)的变量。这些私有(private)变量实际上并不属于对象,而只能通过对象的方法访问。例如:

var getPersonInstance = function (name) {

// Those are "private" properties
var myName = name;

return {
getName: function () {
return myName
},
setName: function (name) {
myName = name;
},
sayHello = function () {
alert('hello! my name is ' + myName);
}
}
};

var person = getPersonInstance('Juan');
person.getName(); // Returns Juan
person.myName = 'Don Vito' // This sets the person.myName property, which is not the one in the closure
person.setName('John') // Works
person.sayHello(); // alert hello! my name is John

你可以在这里查看:

http://jsfiddle.net/MLF7v/1/

如果你觉得构造函数符号更舒服,你可以这样做:

(未测试)

function Person(name) {
// Anything that is not attached to this will be private
var myName = name;


this.getName = function () { return myName;};
this.setName = function (newName) {myName = newName;};
this.sayHello = function () {alert('hey there, my name is' + myName);};
}

这与上面几乎相同,因为未使用原型(prototype)并且方法直接复制到对象中。

然而,闭包方法是耗费内存和时间的,最糟糕的是:它们使用实际上不属于您正在使用的对象的变量......这是一个重要的“语义”问题(< em>这个 Prop 是我的还是不属于我的?)这让继承变得很头疼。这样做的原因是,扩展对象的方法要么无法访问该私有(private)伪属性(因为它们未在 super 对象闭包中定义),要么无法访问“ super 对象”(方法在超对象中定义,因此访问超对象的闭包)。那是胡说八道。

“文化”方法

以我的愚见,封装并不能阻止任何人在他/她真的想要的情况下弄乱你的代码,所以我更愿意遵循 python 哲学“我们都是成熟的人”,它包括使用约定说“我希望不要从外部使用此属性”。例如,我在私有(private)属性前加上“_”,表示它们是私有(private)的、 protected 或其他任何东西,但请远离它。不该碰的就不碰。

这种方法除了最简单和最有效之外,还允许您使用继承链,因为属性在对象中而不是在闭包中。

var Person = function (name) {
this._name = name;
}
Person.prototype.sayHello = function () {...};
Person.prototype.getName = function () {...};
Person.prototype.setName = function () {...};

关于javascript - 用JavaScript封装,存在吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19948698/

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