Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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 构造函数中的公共与私有属性_Javascript_Variables_Object_Constructor - Fatal编程技术网

Javascript 构造函数中的公共与私有属性

Javascript 构造函数中的公共与私有属性,javascript,variables,object,constructor,Javascript,Variables,Object,Constructor,我发现了类似的问题,但没有一个能明确回答这个问题,所以我希望有人能帮我澄清一下 关于构造函数,我试图弄清楚默认情况下,变量和函数是公共的还是私有的。 例如,我有一个具有以下属性的示例构造函数: function Obj() { this.type = 'object'; this.questions = 27; this.print = function() { console.log('hello world'); } } 我可以这样称呼这些属性: var box =

我发现了类似的问题,但没有一个能明确回答这个问题,所以我希望有人能帮我澄清一下

关于构造函数,我试图弄清楚默认情况下,变量和函数是公共的还是私有的。

例如,我有一个具有以下属性的示例构造函数:

function Obj() {
  this.type = 'object';
  this.questions = 27;
  this.print = function() {
    console.log('hello world');
  }
}
我可以这样称呼这些属性:

var box = new Obj();
box.type; // 'object'
box.print(); // 'hello world'
在我看来,函数和变量在默认情况下都是公共的。是这样吗? 或者,如果构造函数中的函数是私有的。。。它们只能将私有变量作为参数吗?


谢谢。

Javascript实例上的所有属性(您使用
this.property=xxx
指定的内容)都是公共的-无论它们是在构造函数中还是在其他地方指定的

如果使用
Object.defineProperty()
给定的属性可能是只读的,也可能是getter或setter,但它们对外部世界都是可见的

Javascript没有用于“私有”属性的内置语言功能。可以将构造函数中的局部变量或局部函数用作私有变量,但它们仅对构造函数中定义的代码或方法可用

因此,在您的示例中:

function Obj() {
  this.type = 'object';
  this.questions = 27;
  this.print = function() {
    console.log('hello world');
  }
}
所有属性
类型
问题
打印
均可公开访问


创建“私有”方法的一种技术是在构造函数中定义一个局部函数,如下所示:

function Obj() {
  var self = this;

  // this is private - can only be called from within code defined in the constructor
  function doSomethingPrivate(x) {
      console.log(self.type);
  }

  this.type = 'object';
  this.questions = 27;
  this.print = function(x) {
    doSomethingPrivate(x);
  }
}

这里有一个关于使用构造函数闭包创建私有访问的更常见的参考:。

不是100%清楚你在问什么。如果您可以访问这些变量和函数,它们肯定是公共的吗?完全理解可能是一件复杂的事情。“
在许多编程语言中,你会听到公共和私有作用域,在JavaScript中没有这样的东西。但是,我们可以通过闭包之类的东西来模拟公共和私有作用域。”
语句“…函数和变量都是公共的…”让我觉得你对变量和属性有点困惑,或者你只是表达得不够精确。不管是哪种方式,都要确保你完全理解其中的区别。这会让事情变得非常清楚。非常感谢。请使用术语“实例属性”而不是“实例变量”。否则听起来你是指一个变量:-)@Bergi-我修改了措辞,这样OP就不会混淆,尽管“实例变量”似乎具有所描述的适当含义,@jfriend00:好的,但我认为术语仅限于类编程语言。JS也不区分(非函数)“变量”和“方法”。“实例成员”听起来更适合描述OOP概念和JS对象属性。