【问题标题】:Why public method cannot access private member when defined within the class scope为什么在类范围内定义公共方法不能访问私有成员
【发布时间】:2016-01-22 08:53:09
【问题描述】:

在一些 javascript 视频教程 (Private members in JavaScript) 中有关于什么是私有、特权和公共成员的解释,并显示了这段代码示例:

function Emloyee(firstName, lastName){

    // Private field
    var privateFullName;

    // Public fields
    this.firstName = firstName;
    this.lastName= lastName;   

    // Private function 
    var privateGetFullName = function(){
        privateFullName = firstName + " " + lastName; 
        return privateFullName;
    }

    // Privileged function
    this.privilegedGetFullName = function(){
        return privateGetFullName();
    } 

    // Public function
    Employee.prototype.publicGetFullName = function(){
        return this.privilegedGetFullName ();
    }
}

据说公共方法可以调用特权方法,但不能调用私有方法。如果在这个例子中定义为内部函数的公共函数将在这个类例子之外定义,我会同意这一点,但在这个例子的情况下,它是在存在私有成员的类范围内定义的,所以为什么这个公共函数不接受私有成员值和闭包一样吗?

另外我要提一下,在观看本教程之前,对我来说,在这个示例中所谓的特权方法和公共方法它们都是相同的并且只是公共的(我不知道第一个应该称为特权)并且我们称之为将类原型扩展为公共函数的那个​​,我以前只是知道当我们必须向已定义的类添加带有 this 关键字的方法时,我们应该使用原型。

【问题讨论】:

  • “那么为什么公共函数不像闭包那样采用私有成员值呢?” – 不太清楚你想在这里问什么。跨度>
  • 我只是想问为什么扩展原型的公共函数不能访问私有成员? (作为一个内部函数,当它在自身内部保留一个变量值时成为一个闭包)
  • 可以在 javaScript 的公共函数中访问私有变量。我看到的预审函数和公共函数之间的唯一区别是,每个实例化都会导致内存被用于预审函数,但在公共函数的情况下,所有实例化都将重用相同的函数。

标签: javascript prototype


【解决方案1】:

公共方法Employee.prototype.publicGetFullName 必须在Employee 构造函数之外定义。

当您在内部使用它并引用私有函数时,它将在每次实例化时重新定义,因此它将返回最后创建的实例的“私有”数据而不是此实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2012-09-24
    • 1970-01-01
    相关资源
    最近更新 更多