Javascript更改生成的getter返回的值

时间:2017-03-24 14:20:16

标签: javascript

我只是在Javascript中使用命名空间和类系统,我一直在努力让一些getter / setter工作。

在我的代码中,我将一个对象传递给函数CreateClass。它从propX形式的对象中读取一个键,其中属性的名称为X.

最后,我尝试拨打getX(),但会返回Y的值HELLO。问题源于第22-33行。我认为创建一个新的name变量可能会覆盖X的名称。

有没有办法避免这种情况?就像能够克隆name一样,使getX

保持唯一

var global_ns = {}

function AddNamespace(ns, names) {
  var names_split = names.split('.');
  for (var i = 0; i < names_split.length; i++) {
    var name = names_split[i];
    if (!(name in ns)) {
      ns[name] = {}
    }
    ns = ns[name];
  }
}

function CreateClass(attributes) {
  var cls = function() {
    for (var key in attributes) {
      if (attributes.hasOwnProperty(key)) {
        if (key == 'ctor') {
          this.ctor = attributes[key];
        } else {
        	// ###################################
          var found = key.match(/^prop(\w[\d\w_\?]*)$/);
          if (found) {
            var prop = attributes[key];
            var name = found[1];
            this[name] = prop.init_value;
            this['get' + name] = function() {
              return this[name];
            }
            this['set' + name] = function(value) {
              this[name] = value;
            }
          }
          // ###################################
        }
      }
    }
    if (this.ctor) {
      var ctor_values = new this.ctor();
      for (var key in ctor_values) {
        if (ctor_values.hasOwnProperty(key)) {
          this[key] = ctor_values[key];
        }
      }
    }
  }
  return cls;
}

AddNamespace(global_ns, "a.b.c");

// ###################################
var simple_class = CreateClass({
  ctor: function() {
    this.a = 123;
    this.b = "something";
  },
  propX: {
    init_value: 10
  },
  propY: {
    init_value: "HELLO"
  }
});

var cls = new simple_class();

console.log(cls.getX());
// ###################################

0 个答案:

没有答案