Javascript 为简单属性编写getter是一种习惯吗?

Javascript 为简单属性编写getter是一种习惯吗?,javascript,coding-style,Javascript,Coding Style,这段代码是idomatic的,还是我应该直接访问属性 self.isAlive = function() { return self.alive; } 这完全取决于执行情况 如果您觉得属性始终是值,那么访问该属性就足够了。如果您觉得有某种逻辑决定返回一个“正确格式化”的值,我会使用一种方法(或者如果该值可能是基于其他因素的动态值,那么使用一种方法是个好主意) 更进一步说,像C#这样的其他语言有一些属性,可以安全地公开值,但不一定改变它们。JS没有这样一种保护它的方法,因此经常使用get来公

这段代码是idomatic的,还是我应该直接访问属性

self.isAlive = function() {
  return self.alive;
}

这完全取决于执行情况

如果您觉得属性始终是值,那么访问该属性就足够了。如果您觉得有某种逻辑决定返回一个“正确格式化”的值,我会使用一种方法(或者如果该值可能是基于其他因素的动态值,那么使用一种方法是个好主意)

更进一步说,像C#这样的其他语言有一些属性,可以安全地公开值,但不一定改变它们。JS没有这样一种保护它的方法,因此经常使用
get
来公开属性,但是是以只读方式


这一切都是关于您希望数据的方式,同时还试图预测如果您直接公开属性与通过方法公开属性,最坏的情况可能是什么。

这是主观的。对getter和setter的使用进行了详细讨论。有些人(比如我)说你应该始终使用getter和setter来遵循封装原则,而另一些人则说你不应该这样做,因为你的应用程序将变得无法维护。

如果你不希望外部js代码修改你的属性,这是一个很好的做法。如果这是期望的效果,您可以考虑使用VAR赋值该属性,而不是使其成为该对象的属性。这样,对象中的代码可以修改它,但只能通过getter访问它

var alive = false;
function isAlive(){ return alive;}
您可以使用:

function isAlive(){
    return arguments.callee.alive;
}
isAlive.alive=true;
在严格模式下,这看起来还可以

实现这一点的另一种方法是

function isAlive(){
    return isAlive.alive;
}
isAlive.alive=true;

但问题是,有人可以使用名称作为字符串,或重命名函数等。。。您可以取消状态。

您似乎在谈论经典OOP意义上的属性,即类的属性。在当前版本的Javascript中,模拟这种行为并不是完全干净的。考虑下面的例子:

    var Widget = function() {
        var private = 'private';
    }
“Widget”是一个构造函数,“private”将在构造函数的作用域中实例化。这意味着只有一种方法可以从构造函数函数范围之外访问“private”:

    var Widget = function() {
        var private = 'private';
        this.getPrivate = function() {
            return private;
        }
    }
这将隐藏每个小部件实例的私有变量,但不幸的是,“getPrivate”现在必须添加到每个小部件实例中。您可以通过语句
this.getPrivate=…
在构造函数中看到这种情况。每次使用
var widget1=new Widget()
创建小部件实例时,该特定实例将添加一个新函数“getPrivate”

在Javascript中创建可重用组件的正常方法是使用其原型继承的实现。将原型对象分配给构造函数,该构造函数将在组件的所有实例中共享方法和属性。我将在下面提供一个示例来解释,但是如果您正在使用面向对象的javascript,您应该注意原型继承的一些注意事项。很好

下面是一个示例,说明这可能会如何影响您的示例:

    var Widget = function() {
        this.alive = true;
    }
    Widget.prototype.isAlive = function() {
        return this.alive;
    }
    var widget1 = new Widget();
    widget1.isAlive();  // returns true
这里的问题是属性
alive
正在添加到对象中,因此,它是公开可用的,也就是说,您的小部件的任何用户都可以通过他们最喜欢的FireBug变体中的DOM查看(以及自由修改)该属性

考虑一种尝试向外部用户隐藏
活动的变体。由于
alive
Widget
实例的一个属性,因此您可能希望包含代码以将其隐藏在构造函数中,如下所示:

    var Widget = function() {
        var alive = true;
    }
但是,正如本文开头所述,在本例中,
alive
仅暴露于构造函数的作用域;因此,原型上的方法无法访问它。原因是这些方法中的每一个都没有与构造函数相同的作用域,因为Javascript只有函数作用域


总之,如果您试图在可重用组件中隐藏数据,javascript并没有提供一种干净的方法。如果您不介意为相同的方法在每个组件实例上分配新内存,那么您可以在本文中使用我的第二个代码示例。但是,如果希望只在内存中分配一次方法,则需要公开对象实例上的属性,例如,
this.alive=true

当然,在函数声明中使用
this
值显然不是惯例。(这是因为它引用全局对象,除非该函数是通过
call
apply
调用的,或是通过
bind
绑定的)您通常在方法和构造函数内部使用
this
,而不是在声明内部使用。@ŠimeVidas-更改为
self
。这实际上是我的原始代码,我只是想让它更清楚。。。nm:)嗯,我不明白。如果
isAlive
this
对象的方法,为什么要从中返回
self
对象的属性。如果
this
self
引用同一个对象(这是我的假设),您应该坚持使用一个名称(最好是您通过变量
self
创建的名称,在本例中),并且不要互换使用这两个名称。@ŠimeVidas-再次修复。在我的特定代码段中,这个==self。js没有属性访问器并不完全正确。所以,如果你不需要瞄准IE,你可能不应该写getter和setter。我明确的意思是在严格模式下。对不起。。。您的示例没有文档。请编写。。。所以我没有收到任何错误。@Thadeudaula更新抛出:“未捕获的TypeError:'调用方','被调用方'和'参数'属性可能无法在严格模式函数或用于调用它们的参数对象上访问”