Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
原型中的javascript私有成员_Javascript_Private Members - Fatal编程技术网

原型中的javascript私有成员

原型中的javascript私有成员,javascript,private-members,Javascript,Private Members,我想开始说我对JS感到不舒服 我在原型中实现私有方法时遇到了一个问题。假设我们有一个Person类。我想公开greet方法,但保持getName私有 function Person(name) { this.name = name; } Person.prototype = (function() { function getName() { return this.name; } function greet() { con

我想开始说我对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));
}
然而,它变得有点大类混乱


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

您编写它的方式
getName
不是一个方法,而是一个静态函数。如果您不想将其设置为公共方法(我看不出getter是私有的原因),也不想使用
.call()
,那么您需要显式地传递实例:

Person.prototype = (function() {

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

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

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

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

我认为最好的解决方案是不用担心私人和公共,只是用下划线前缀内部方法。@ TEMU:这一公约被广泛接受,而且并不真正缺乏竞争力。当然,您需要一些能力来决定何时可以应用此约定。@kit:请注意,“原型中的私有成员”这一术语可能会让人混淆
getName
不是一个成员(属性),它只是一个局部变量。@Bergi我同意,我会将它命名为private method@kit,或者使用
Object.defineProperty
使它不可写。“我看不出getter为什么是private”这只是一个例子。JS不是我的世界,但这两个解决方案对我来说都不干净。好吧,“干净”JS只是把所有东西都当作属性,根本不使用任何隐私。因为隐私在JS这样动态的语言中是很难保护的。