繁体   English   中英

JavaScript私有变量,函数

[英]JavaScript private variables, functions

在Codecademy上学习JavaScript,对第24/30课有几个疑问

在下面的代码中:

  1. 为什么john.getBalance()最后一行)不会导致错误时,为getBalance功能未声明this.prototype.getBalancethis.getBalance 我认为子类只有在用“原型”声明的情况下才能使用超类的功能。
  2. 声明函数this.getBalancePerson.getBalance什么区别?
  3. 是在构造函数内部还是外部声明函数只是一个约定,还是在功能上有所不同?
  4. 如果bankBalance是私有的,我怎么知道允许哪些功能访问它? 为什么代码中的getBalance允许访问bankBalance

我的代码:

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

1)为什么john.getBalance()最后一行)不会导致错误时, getBalance功能未声明this.prototype.getBalancethis.getBalance 我认为子类只有在用“原型”声明的情况下才能使用超类的功能。

就像我在回答上一个问题时所说的那样,只有一组属性。 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. this.getBalance存在于每一个实例,而Person.prototype.getBalance仅在Person类(函数)。 在JavaScript中,继承与传统的OOP语言不同。

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

  3. 不同。

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

让我们按顺序浏览您的问题。

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

  2. 这与以上联系在一起。 如果已在Person.prototype上声明了该方法,则该方法将在您创建的所有Person对象之间共享,而现在每个Person都有自己的getBalance()方法。 因此,原型方法通常可以提供性能优势。

  3. 不知道你的意思在这里。 随时提供澄清,我会尽力回答。

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

  1. 没有区别

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

  3. 没有津贴

  4. 全部都是一样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM