【问题标题】:Public vs Private Properties Inside Constructors [duplicate]构造函数内部的公共与私有属性[重复]
【发布时间】:2016-02-27 17:49:11
【问题描述】:

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

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

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

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'

在我看来,函数和变量默认都是公开的。那正确吗? 或者,如果构造函数中的函数是私有的……它们只能将私有变量作为参数吗?

谢谢。

【问题讨论】:

  • 不是 100% 清楚你在问什么。如果您可以访问这些变量和函数,它们肯定是公开的吗?
  • Javascript Variable Scope 可能是一件很难完全理解的事情。 "In many programming languages, you’ll hear about public and private scope, in JavaScript there is no such thing. We can, however, emulate public and private scope through things like Closures."
  • 像“…函数和变量都是公共的…”这样的语句让我觉得你对变量有点困惑属性,或者您的表达方式可能不准确。无论哪种方式,请确保您完全了解其中的区别。

标签: javascript variables object constructor


【解决方案1】:

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

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

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

所以,在你的例子中:

function Obj() {
  this.type = 'object';
  this.questions = 27;
  this.print = function() {
    console.log('hello world');
  }
}

typequestionsprint 的所有属性均可公开访问。


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

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);
  }
}

以下是使用构造函数闭包创建私有访问的更常见参考之一:http://javascript.crockford.com/private.html

【讨论】:

  • 这完美地清除了它。谢谢!
  • 请使用术语“实例属性”而不是“实例变量”。否则听起来你的意思是一个变量:-)
  • @Bergi - 我修改了措辞,因此 OP 不会混淆,尽管“实例变量”似乎具有如 herehere 所述的适当含义。
  • @jfriend00:好的,但我认为术语仅限于经典编程语言。 JS 也不区分(非函数)“变量”和“方法”。 “实例成员”听起来更适合描述 OOP 概念和 JS 对象属性。
猜你喜欢
  • 1970-01-01
  • 2017-04-30
  • 2016-07-31
  • 2016-12-03
  • 1970-01-01
  • 2010-10-13
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多