JavaScript私有变量,函数

时间:2014-08-13 05:48:02

标签: javascript variables private

在codecademy上学习JavaScript,有关于第24/30课的几个问题

在下面的代码中:

  1. 当getBalance函数未声明为john.getBalance()而是this.prototype.getBalance时,为什么this.getBalance(最后一行)不会导致错误?我认为,如果使用" prototype"声明子类,子类只能使用超类的函数。
  2. 声明函数this.getBalancePerson.getBalance
  3. 之间的区别是什么?
  4. 声明构造函数内外的函数只是一个约定还是它会产生功能差异?
  5. 如果bankBalance是私有的,我怎么知道允许哪些功能访问它?为什么代码中的getBalance允许访问bankBalance
  6. 我的代码:

    function Person(first,last,age) {
        this.firstname = first;
        this.lastname = last;
        this.age = age;
        var bankBalance = 7500;
    
        this.getBalance = function() {
            // your code should return the bankBalance
            return bankBalance;
        };
    }
    
    var john = new Person('John','Smith',30);
    console.log(john.bankBalance); //undefined
    
    // create a new variable myBalance that calls getBalance()
    console.log(myBalance=john.getBalance());
    

4 个答案:

答案 0 :(得分:3)

  

1)为什么john.getBalance()(最后一行)在getBalance函数未声明为this.prototype.getBalance而是this.getBalance时不会导致错误?我认为如果使用“prototype”声明子类,子类只能使用超类的函数。

正如我在my answer to your last question中所说,只有一组属性。 Javascript将首先查看对象本身,如果没有找到属性匹配,它将查看原型。没有属于子类的单独属性集和超类的单独集。直接在对象上有一组属性,如果没有直接找到对象本身的匹配属性,则有一个定义的查找顺序(如何搜索原型),但它在逻辑上是对象上的一组整体属性(和方法只是一个具有其值的函数的属性)。没有一组属性属于超类,一组属于子类。在Javascript中你不应该这样想(我知道在其他一些语言中感觉就像那样,但在javascript中却不是这样)。

  

2)声明函数this.getBalance与Person.getBalance之间有什么区别?

this.getBalance指的是特定对象的方法。

Person.getBalance是指Person构造函数中的属性,它不是您声明的内容。

如果您指的是声明this.getBalancePerson.prototype.getBalance之间的区别,那么主要区别在于查找顺序中找到函数的位置。两者都可以在任何Person对象或从Person对象派生的任何对象上找到。从技术上讲,如果在原型上声明它,它对运行时更有效,因为只有一个函数对象的共享实例,而不是为每个Person实例创建一个新的函数对象实例,但在操作上它们是相同。除非有特殊原因,否则首选使用原型。

  

3)声明构造函数内外的函数只是一个约定还是它会产生功能差异?

在原型上声明方法更有效,但它们也可以在构造函数中声明,除了构造函数中声明的方法可以访问构造函数中声明的局部变量之外,几乎没有操作差异,可以用作私有实例变量。除非有特殊原因,否则首选使用原型。

  

4)如果bankBalance是私有的,我怎么知道允许哪些函数访问它?为什么允许代码中的getBalance访问bankBalance?

只有在构造函数中声明的函数(声明bankBalance)才能访问它。这只是简单的javascript范围规则,但如果你想实现这样的私有实例变量,它会派上用场。

答案 1 :(得分:1)

  1. this.getBalance存在于每个实例中,而Person.prototype.getBalance仅存在于Person类(函数)中。在JavaScript中,继承与传统的OOP语言不同。

  2. 在您的示例中,您无法调用Person.getBalance,也未声明此类函数。

  3. 不同。

  4. 在JavaScript中,没有private个字段。您只能使用闭包来模拟这个概念。

答案 2 :(得分:1)

让我们按顺序回答你的问题。

  1. getBalance()Person对象上定义为实例方法。这只是意味着每个Person都有自己的getBalance()方法。

  2. 这与上述相关。如果您已在Person.prototype上声明了该方法,则会在您创建的所有Person个对象中共享该方法,而现在每个Person都有自己的getBalance()方法。由于这个原因,原型方法通常可以提供性能优势。

  3. 不确定你的意思。请随意提供说明,我会尽力回答。

  4. 在另一个函数内声明的函数可以访问外部函数中声明的变量,因此getBalance()可以访问bankBalance。但由于bankBalance不是Person对象的属性,因此您无法通过john.bankBalance访问它,这就是undefined的原因。

答案 3 :(得分:0)

  1. 没有区别

  2. 是的,它将是全球性的或本地的

  3. 没有津贴

  4. 它们都是一样的