gpt4 book ai didi

javascript - Javascript 中的封装/数据隐藏?

转载 作者:行者123 更新时间:2023-11-30 09:53:29 24 4
gpt4 key购买 nike

我想了解 JavaScript 中封装的概念,以及如何使我的属性和方法公开或私有(private)。

我正在玩这个例子:

    var person = function(newName, newAge) {

// Private variables / properties
var name = newName;
var age = newAge;

// Public methods
this.getName = function() {
return name;
}

// Private methods
var getAge = function() {
return age;
}

// Public method, has acces to private methods
this.giveAge = function() {
return getAge();
}
}

var jack = new person("Jack", 30);

console.log(jack.name); // undefined
console.log(jack.getName); // Jack
console.log(jack.getAge()); // TypeError: jack.getAge is not a function
console.log(jack.getAge); // undefined
console.log(jack.giveAge()); // 30

因此,变量 var namevar age 是私有(private)的。为了访问它们,我通过使用 .this 引用来使用公共(public)方法。因此,我的函数内的任何 var 都是私有(private)的,而我的对象内的任何 .this 都在外部可见。

我猜这是因为 person 是可见的,所以它公开了它的所有属性。

我走在正确的轨道上吗?这是隐藏或公开您的属性/方法的正确方法吗?

还有一个问题,为什么 console.log(jack.getAge()); 会抛出错误?当引用我“存储”在变量中的函数时,我是否应该将 () 放在该函数的末尾,它是双向的,所以我不知道有什么用?

谢谢!

最佳答案

I guess that's cause person is visible, so it exposes all of its properties.

正确。

Am I on the right track? Is this the right way to hide or expose your properties / methods?

如果您想这样做,那么是的,这是一种相当标准的方法。从 ES2015 开始,至少还有一种其他方式,但(可能)开销更多。

And one more question, why does console.log(jack.getAge()); throws an error?

因为 jack 对象没有 getAge 属性,所以 jack.getAge 产生 undefined,这不是一个功能。在 giveAge 闭包有权访问的上下文中有一个 getAge 变量(连同 age name),但是 jack 没有 getAge 属性。

And when referencing functions I "stored" in variables, should I put () at the end of that function, it works both ways, so I don't know what do use?

不,这不是双向的。 jack.getName 获取函数的引用。 jack.getName()调用该函数并获取其返回值。

我应该注意到 getAge 函数没有意义。它只能被 person 函数中定义的闭包访问,就像 agename 一样。因此,任何使用 getAge 的东西都将只使用 age 而避免函数调用。


为了完整起见,我会注意到许多人并不担心 JavaScript 中真正的私有(private)属性,而是选择“按照约定私有(private)”——例如,他们使用命名约定(例如以 _ 开头的名称) 表示“不要碰这些,它们是私有(private)的。”这并不能阻止人们使用它们,当然,它只是表明他们不应该使用它们。提倡这一点的人通常指出,在许多具有“真正的”私有(private)属性/字段(Java、C#)的语言中,这些属性/字段只需通过反射进行少量工作即可访问。因此,争论的焦点是,仅使用命名约定就是“私有(private)的”。

我不同意(也不是特别不同意)这一点,它确实需要在 Java 或 C# 中做更多的工作才能访问私有(private)属性而不是公共(public)属性。我只是注意到“按惯例私有(private)化”的方法非常普遍,而且通常“足够好”。

关于javascript - Javascript 中的封装/数据隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35227397/

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