我只是在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());
// ###################################