Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应该在JavaScript中使用setter/getter方法吗_Javascript_Oop - Fatal编程技术网

应该在JavaScript中使用setter/getter方法吗

应该在JavaScript中使用setter/getter方法吗,javascript,oop,Javascript,Oop,首先,这可能是基于主要观点的,因此我正在寻找技术原因和普遍接受的最佳实践来做一件或另一件事 如果我写一个“类”并创建它的一个成员,我可以像这样访问实例属性 function MyClass(){ var self = this; self.foo = 'bar' } var instance = new MyClass(); instance.foo = '420'; 但是,我也可以创建一个方法来设置属性,这样就不需要了解类的内部结构 MyClass.prototype

首先,这可能是基于主要观点的,因此我正在寻找技术原因和普遍接受的最佳实践来做一件或另一件事

如果我写一个“类”并创建它的一个成员,我可以像这样访问实例属性

function MyClass(){

  var self = this;

  self.foo = 'bar'

}   

var instance = new MyClass();

instance.foo = '420';
但是,我也可以创建一个方法来设置属性,这样就不需要了解类的内部结构

MyClass.prototype.setFoo = function(prop){
  this.foo = prop;
};

考虑到专业发展,是否有理由选择一种变体而不是另一种变体?

以下是一个很好的示例,说明如何正确使用私有-使用作用域(在您的示例中,我可以在函数外部设置\access foo,而无需使用set\get函数):


这里有一个很好的例子,说明了如何正确使用私有函数-使用作用域(在您的示例中,我可以在函数外部设置\access foo,而无需使用set\get函数):

这是我建议你读的一本书。他非常清楚地解释了在Java脚本中创建“类”的不同模式(工厂、构造函数和原型)

我在不久前尝试创建一些类时获得了所需的所有信息。 我希望你找到需要的:)

正如尼古拉斯·扎卡斯(Nicholas Zakas)所解释的那样,阿米罗斯建议的问题在于,“每次 调用myClass()函数时,将创建一个名为setFoo()的新函数,这意味着每个对象都有自己的setFoo()版本,而实际上,每个对象都应该共享相同的函数

比如说,

class1 = new MyClass();
class2 = new MyClass();
console.log(class1.setFoo == class2.setFoo); // false
我建议您阅读,他非常清楚地解释了用Java脚本创建“类”的不同模式(工厂、构造函数和原型)

我在不久前尝试创建一些类时获得了所需的所有信息。 我希望你找到需要的:)

正如尼古拉斯·扎卡斯(Nicholas Zakas)所解释的那样,阿米罗斯建议的问题在于,“每次 调用myClass()函数时,将创建一个名为setFoo()的新函数,这意味着每个对象都有自己的setFoo()版本,而实际上,每个对象都应该共享相同的函数

比如说,

class1 = new MyClass();
class2 = new MyClass();
console.log(class1.setFoo == class2.setFoo); // false

非常感谢。此示例将我引向一个相关问题:为什么要将这些setter方法实现为静态方法,而不是将它们添加到原型中?@Sprotte,因为原型函数无法访问私有范围的变量。当使用闭包创建“private”成员时,每个对象实例都需要单独的方法实例。每个方法实例只能看到它自己对象的私有变量。此示例将我引向一个相关问题:为什么要将这些setter方法实现为静态方法,而不是将它们添加到原型中?@Sprotte,因为原型函数无法访问私有范围的变量。当使用闭包创建“private”成员时,每个对象实例都需要单独的方法实例。每个方法实例只能看到它自己对象的私有变量!原型模式的问题是,正如Amiros指出的,属性仍然可以从外部编辑。现在我无法决定该怎么做:/Nicholas Zakas对setter/getter方法怎么说?OP没有问关于课程的问题。谢谢,我会试试的!原型模式的问题是,正如Amiros指出的,属性仍然可以从外部编辑。现在我无法决定该怎么做:/Nicholas Zakas对setter/getter方法怎么说?OP没有询问类。基本上,来自的列表对JS也是有效的。基本上,来自的列表对JS也是有效的。