Js OOP:来自 class 的私有变量

Js OOP: private variable from a class

谁能告诉我为什么要打印 'undefined'?

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。

bankBalance 如您所写,它的范围仅限于构造函数。如果你想将它作为实例变量访问,你需要像 this.firstname 等那样声明它。阿尔。

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

由于 bankBalance 的范围仅在构造函数中,您需要添加 this。你可以这样做:

this.bankBalance = 7500;

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

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

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

这里是 JSFiddle 演示了局部变量 bankBalance.

的 getter 和 setter 函数

这是另一个 JSFiddle,带有一个 'public' bankBalance 变量,可以作为实例变量访问。

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

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

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

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