【问题标题】:What JavaScript pattern do I use to access private methods from a prototype method? [duplicate]我使用什么 JavaScript 模式从原型方法访问私有方法? [复制]
【发布时间】:2015-10-31 23:14:07
【问题描述】:

我使用什么 JavaScript 模式给了我:

  1. 原型上的公共方法
  2. 可以从 #1 调用的私有方法
  3. 私有变量

在尝试从原型公共方法调用私有方法时,我发现的其他答案似乎返回 undefined。

【问题讨论】:

  • 请定义“私有”以及为什么告诉我们您为什么要使用原型。
  • 私有方法不在原型上。以及能够在未来某个日期使用派生的子“类”修改类行为的原型。
  • 这不是“私有”,这就是我们所说的“特定于实例”或“自己的属性”(它们仍然是公开的)。
  • 稍后(从外部)修改类行为基本上需要非私有变量
  • JavaScript 没有私有方法或属性的概念。您可以在构造函数中定义变量和函数,也可以在构造函数中定义方法,从而使“公共”方法可以访问“私有”变量和函数。然而,这些都不涉及原型。在原型上定义的方法不在访问构造函数内定义的变量和函数的范围内。所以你想要的是不可能的。另请注意,您在构造函数中做的越多,实例化的处理就越繁重。

标签: javascript


【解决方案1】:

事实上,你不能从原型中访问私有的东西。

原型通过将对象作为上下文绑定到所有方法来工作,因此您可以使用this 关键字来访问它。

在面向对象的编程中,你所说的私有是在编译时解决的,暗示你试图访问的数据不应该从类外部读取。 但在运行时,这些数据的存储方式与其他属性相同。

要让方法访问私有字段,您可以直接在实例上而不是在原型上创建方法以允许它访问私有范围。 这称为特权方法。 查看来自 Douglas Crockford 的 this article

var ClassExample = function () {

    var privateProperty = 42
    this.publicProperty = 'Hello'

    var privateMethod = function () {
        return privateProperty
    }

    this.privilegedMethod = function () {
        return privateProperty
    }
}

ClassExample.prototype.publicMethod = function() {
    return this.publicProperty
}

像 Typescript 这样的语言,添加类和打字 + 隐私设置将私有字段与公共字段一起存储。

class ClassExample {

    private privateProperty
    public publicProperty

    constructor () {
        this.privateProperty = 42
        this.publicProperty = 'Hello'
    }

    method () {
        return this.privateProperty
    }

}

将编译

var ClassExample = (function () {
    function ClassExample() {
        this.privateProperty = 42;
        this.publicProperty = 'Hello';
    }
    ClassExample.prototype.method = function () {
        return this.privateProperty;
    };
    return ClassExample;
})();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2011-02-11
    • 2011-10-01
    • 2011-06-10
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多