【问题标题】:javascript private members in prototype原型中的javascript私有成员
【发布时间】:2014-12-09 18:48:08
【问题描述】:

我想开始说我对 JS 感到不舒服。

我在原型中实现私有方法时遇到了问题。假设我们有一个 Person 类。我想公开 greet 方法但保持 getName 私有。

function Person(name) {
    this.name = name;
}

Person.prototype = (function() {

    function getName() {
        return this.name;
    }

    function greet() {
        console.log("hello " + getName());
    }

    return {
        greet: greet
    }
})();

p = new Person('Szymon');
p.greet();

上面的代码无法工作,因为 getName 没有上下文(“this”指向不存在名称的窗口)。

我对这个问题的解决方案是:

function greet() {
    console.log("hello " + getName.call(this));
}

但是,大课会有点乱。

这是一个干净的解决方案吗?如有任何反馈,我将不胜感激。

【问题讨论】:

  • 我认为最好的解决方案是不要担心私有和公共,只需在内部方法前加上下划线即可。
  • @Teemu:这种约定被广泛接受,并不缺乏能力。当然,您需要一些能力来决定何时应用此约定是可行的。
  • @kit:请注意术语“原型中的私有成员”可能会造成混淆。 getName 不是成员(属性),它只是一个局部变量。
  • @Bergi 我同意,我将其命名为私有方法。
  • @kit,或使用Object.defineProperty 使其不可写。

标签: javascript private-members


【解决方案1】:

getName 的编写方式不是方法,而是静态函数。如果你不想让它成为一个公共方法(我看不出为什么 getter 是私有的),并且不想使用.call(),那么你需要明确地传递实例:

Person.prototype = (function() {

    function getName(self) {
        return self.name;
    }

    function greet() {
        console.log("hello " + getName(this));
    }

    return {
        constructor: Person,
        greet: greet
    }
})();

我认为所有三种解决方案都同样干净。

【讨论】:

  • “我看不出为什么 getter 是私有的”这只是一个例子。 JS 不是我的世界,但我觉得这两种解决方案都不干净。
  • 好吧,“干净” JS 只是将所有内容都作为属性,根本不使用任何隐私。无论如何,像 JS 这样动态的语言很难保护隐私。
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2013-08-02
  • 2010-09-30
  • 2015-03-19
相关资源
最近更新 更多