2016-07-03 75 views
2

你好社区这是一个简单的问题。Js OOP:一个类的私有变量

有人可以告诉我为什么这个打印'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个 谢谢!

+0

因为'john'不有'bankBalance'属性。构造函数Person中的变量'bankBalance'在其外部是不可用的(因为JavaScript的范围规则)。另外,JS没有私有属性的语言支持;不过,闭包可以用来模拟它们。 –

+0

初学者需要牢记的一点是JS中没有“class”。相反,JS使用原型。当你做'var bankBalance'时,它不像Java那样声明一个成员属性,它只定义一个局部变量。要添加属性,您必须实际更改实例的属性('this.bankBalance'),或通过原型('Person.prototype.bankBalance = 7500')更改它。 –

+0

感谢所有。现在我知道Js是如何工作的 –

回答

0

这是因为Javascript的一个特性,称为闭包。它基本上意味着如果对象是嵌套的,那么内部对象只能访问外部对象的变量。通过使用这个关键字,你本质上使该变量成为该对象的一个​​属性。使用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]); 
     } 
    } 
} 
0

bankBalance如您所写,它的作用域仅限于构造函数。如果你想作为一个实例变量来访问它,你需要像在this.firstname et。中那样声明它。人。

1

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

1

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

this.bankBalance = 7500; 

或者,你可以建立一个getter/setter方法为bankBalance,像这样:

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

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

这里是一个JSFiddle展示的getter和setter函数的局部变量bankBalance

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