JavaScript Object.prototype 访问私有(private)值

标签 javascript design-patterns

我读到使用 Object.prototype 将函数附加到自定义 JavaScript 对象比 this.foo = function() 的“传统”方法更有效.我遇到的问题是范围。我希望这些公共(public)方法能够访问对象的私有(private)变量。我最终做的是这样的:

function Foo(){
    var id = 5;
    Foo.prototype.bar = function(){
        alert(id);
    };
}
var x = new Foo();
x.bar();

我将原型(prototype)声明嵌套在对象定义中。这有效并且似乎可以解决问题。有什么理由不这样做吗?有没有更好或更标准的方法来实现这一点?

更新 根据我收到的一些回复,我想我需要说明一点,我完全清楚 JavaScript 中没有 private 变量的概念。我在这里使用术语 private 表示在当前范围之外不可访问,因为它更容易说和写,我假设任何试图回答这个问题的人都会知道我使用术语 的意思私有(private)

最佳答案

虽然您的想法可行,但它可能不会如您所愿。我相信每次实例化新的 Foo 时,您都会覆盖原型(prototype)。每次您创建一个新的 Foo 时,它可能会更改所有 Foo 实例的 bar() 方法。糟糕。

这是一个使用虚假私有(private)变量让某人“谎报”真实年龄的示例。

这是执行此操作的标准方法:

function Person(name, age) {
  this._age = age; // this is private by convention only
  this.name = name; // this is supposed to be public
}

Person.prototype.sayHiTo = function(person) {
  console.log("Hi " + person.name + ", my name is " + this.name);
}

Person.prototype.age = function() {
  return this._age - 3;
}

var j = new Person("Jay", 33);
var k = new Person("Kari", 26);
j.sayHiTo(k) // Hi Kari, my name is Jamund
k.age(); // 23

关于JavaScript Object.prototype 访问私有(private)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9828917/

相关文章:

javascript - 为什么 AJAX 响应不是可排序的方式

javascript - 柏树有什么方法可以等待多个预期条件

php - 反转多对一层次结构

c++ - 具有不同访问权限的类 : read-only to the many, 可写入特权

java - 替换 if else 语句

javascript - 如何将一个查询的值(value)添加到另一个查询

javascript - 如果 react-router4 中的位置没有改变,如何防止 history.push?

javascript - Eloquent Javascript Ch.6 "Another Cell"构造函数中的部分奇怪行为

c# - 当我们有不同的返回类型时实现策略模式

javascript - 设计一款集换式纸牌游戏