javascript - 为什么在类范围内定义时公共(public)方法无法访问私有(private)成员

标签 javascript prototype

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

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

据说公共(public)方法可以调用特权方法,但不能调用私有(private)方法。如果本示例中定义为内部函数的公共(public)函数将在此类示例之外定义,我会同意这一点,但在本示例中,它是在存在私有(private)成员的类范围内定义的,那么为什么公共(public)函数不采用私有(private)成员值和闭包一样吗?

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

最佳答案

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

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

关于javascript - 为什么在类范围内定义时公共(public)方法无法访问私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34942522/

相关文章:

javascript - Raphael js拖放的解释?

javascript - jQuery if (x == y) 不起作用

prototype - 使用独立 DLL 文件验证串行 key - 转换函数 NSIS => Prototype => Pascal

javascript - 使用 apply 创建一个组合 N 个数组的所有元素的函数

JavaScript instanceof 运算符何时返回 true 应该为 false?

javascript - 我如何通过 Angular 向套接字服务器发送数据和获取数据

javascript - 这个 Fibonacci 解决方案如何在 JavaScript 中工作?

javascript - 是否有类似于 iOS 的 canOpenURL 的东西来检查移动浏览器的 URL 方案?

javascript - JS中类方法与className.prototype方法的区别

javascript - 使用 proto 创建一个 Storage 子类