Javascript私有(private)变量+Object.create(引用闭包变量)

标签 javascript closures private object-create

我想知道如何通过 clojure 在 javascript 中创建私有(private)变量。但在使用Object.create时仍然克隆它们。

var point = {};
(function(){
  var x, y;
  x = 0;
  y = 0;
Object.defineProperties(point, {
    "x": {
      set: function (value) {
        x = value;
      },
      get: function() {
        return x;
      }
    },
    "y": {
      set: function (value) {
        y = value;
      },
      get: function () {
        return y;
      }
    }
  });
}());

var p1 = Object.create(point);
p1.x = 100;
console.log(p1.x); // = 100
var p2 = Object.create(point);
p2.x = 200;
console.log(p2.x); //= 200
console.log(p1.x); //= 200

我从 http://ejohn.org/blog/ecmascript-5-objects-and-properties/ 得到了这个技术但它有一个限制,即所有对象上的闭包变量都是相同的。我知道 javascript 上的这种行为是应该的,但是我如何创建真正的私有(private)变量?

最佳答案

I know this behaviour on javascript is supposed but how can I create true private variables?

不能,ES5 中没有 private。如果需要,您可以使用 ES6 私有(private)名称。

您可以使用 ES6 WeakMap 来模拟 ES6 私有(private)名称,这些名称可以在 ES5 中进行填充。这是一个昂贵且丑陋的仿真,不值得付出代价。

关于Javascript私有(private)变量+Object.create(引用闭包变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10067055/

相关文章:

javascript - 使用 javascript 或 jquery 从保存的 html 中获取与元素相关的 jquery.data()

javascript - 在构造函数中创建一个函数会比引用原型(prototype)函数使用更多的内存吗?

scala - 什么是全动力闭合?

closures - 为什么函数参数的生存期与函数内绑定(bind)的生存期不同?

java - 有没有办法在 get() set() 模型中不使用 get() 来拥有只读功能?

javascript - HTML: JQuery 如何使用JQuery获取data-dk-dropdown-value

javascript - jquery 验证 - 调用某些元素的 .valid() 方法不会清除错误

javascript - 移动应用程序的 dropbox api 是否使用本地 dropbox 文件夹来获取和存储文件?

ios - 在不分发源代码的情况下向客户分发内部 iOS 应用程序

c++ - 为什么将私有(private)函数的引用传递给外部函数是有效的?