【问题标题】:Js OOP: private variable from a classJs OOP:来自类的私有变量
【发布时间】:2016-11-05 01:39:43
【问题描述】:

有人能告诉我为什么这个打印“未定义”吗?

function Person(first,last,age) {
   this.firstname = first;
   this.lastname = last;
   this.age = age;
   var bankBalance = 7500;
}

// create your Person 
var john = new Person ('John','Doe',33);

// try to print his bankBalance
document.write (john.bankBalance);

在最后一行我想打印 john.bankBalance 是 7500。

【问题讨论】:

  • 因为john 没有bankBalance 属性。构造函数Person 中的变量bankBalance 在它之外不可用(因为JavaScript 的作用域规则。)另外,JS 没有对私有属性的语言支持;不过,可以使用闭包来模拟它们。
  • 初学者要记住的一点是,JS 中没有“类”。相反,JS 使用原型。当您执行var bankBalance 时,它不像Java 那样声明成员属性,它只定义了一个局部变量。要添加属性,您必须实际更改实例的属性 (this.bankBalance),或通过原型 (Person.prototype.bankBalance = 7500) 进行更改。
  • 谢谢大家。现在我知道了一点 Js 是如何工作的

标签: javascript oop private


【解决方案1】:

this 由于bankBalance 的作用域只能在构造函数中添加。你可以这样做:

this.bankBalance = 7500;

或者,您可以像这样为bankBalance 设置getter/setter:

this.getBalance = function() {
    return bankBalance;
}

this.setBalance = function(balance) {
    bankBalance = balance;
}

这是一个JSFiddle,演示了局部变量bankBalance 的getter 和setter 函数。

这里是另一个JSFiddle,带有一个“公共”bankBalance 变量,可以作为实例变量访问。

【讨论】:

    【解决方案2】:

    bankBalance 仅在函数范围内可用。如果您想公开访问,您应该像使用名字和姓氏一样定义“this”。

    【讨论】:

      【解决方案3】:

      这是因为 Javascript 的一个称为闭包的特性。这基本上意味着如果对象是嵌套的,那么内部对象只能访问来自外部对象的变量。通过使用 this 关键字,您实际上使变量成为该对象的属性。使用 var 声明的变量将无法被布局该方法的对象访问。如需有趣的阅读,请查看此链接

      http://javascript.crockford.com/private.html

      这是一个带有私有变量和一些公共方法和属性的对象的示例。这些特性很有用,因为它们限制了对象的使用。在下面的这个例子中,我们可能不希望开发人员篡改数组,所以我们可能只是给他们一个添加工具,删除工具,他们只能看到偶数索引:-

      function SpecialArray() {
      
          var _array = [];
      
          this.length = _array.length;
      
          this.add = function(stuff) {
              // add some stuff to it
          }
      
          this.remove = function(stuff) {
              // take some stuff out of it
          }
      
          this.displayEvenNumbers = function(){
              for (var i=0; i< _array.length ; i+=2){
                  console.log(_array[i]);
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        您所写的bankBalance 仅适用于构造函数。如果您想将其作为实例变量访问,您需要像使用this.firstname 等一样声明它。人。

        【讨论】:

          猜你喜欢
          • 2011-02-09
          • 2012-05-29
          • 2013-05-30
          • 1970-01-01
          • 2017-01-31
          • 2016-11-22
          • 2012-09-03
          • 1970-01-01
          • 2013-06-11
          相关资源
          最近更新 更多