2

非常愚蠢的问题,但我早些时候随机考虑过这个问题,我从未尝试过这样做......假设我有这样的课程:

function Drug () {
  this.name = '';
  this.type = '';
}

稍后在页面中,我为此药物设置了一些值:

var drug = new Drug();
drug.name = 'Testing';
drug.type = 'TestType';

有没有一种简单的方法可以让我们说这个 Drug 实例重新启动到它的默认值,而不只是做类似的事情:

var drug2 = new Drug();

就像我可以在其中创建的某种重置Drug功能一样drug.reset();

我试过this.clear = function () { return new Drug(); }了:但这并不能解决问题......

4

3 回答 3

5

你只是有点想多了。与其在构造函​​数中直接初始化这些属性,不如创建一个init()由构造函数调用的初始化它们的方法。然后您可以调用它来重新初始化对象的属性。

function Drug () {
  this.init();
}
Drug.prototype.init = function() {
  this.name = '';
  this.type = '';
}

// Instantiate:
var d = new Drug();
d.name = 'Testing';
console.log(d);
// Drug {name: "Testing", type: ""}

// Re-initialize it
d.init();
console.log(d);
// Drug {name: "", type: ""}

这当然不是您可以处理它的唯一方法,而是首先想到的方法。

于 2013-01-05T22:25:47.900 回答
2

通过这种方式,您可以稍后重新定义默认值或添加/删除它们

function Drug() {
  this.init();
}

// initializer
(function(obj) {
  obj.prototype.init = function() {
    for ( var k in obj.prototype ) {
      this[ k ] = obj.prototype[ k ];
    }
  }
}(Drug));

// define here all default properties
Drug.prototype.name = '';
Drug.prototype.type = '';



var drug = new Drug();
drug.name = 'Testing';
drug.type = 'TestType';

console.log( drug );
drug.init();
console.log( drug );

在这里自己尝试一下:http: //jsfiddle.net/bukfixart/vzsFw/

于 2013-01-05T22:40:03.943 回答
1

在类中提供可公开访问的属性的一种相当通用的形式。

从这里,您可以构建一个配置对象(在构造函数中),以超越默认值。

var Drug = function (cfg) {
    var defaults = {
        key : "val"
    };

    this.init = function () {
        var key, val;
        for (key in defaults) {
            if (defaults.hasOwnProperty (key)) {
                val = defaults[key];
                this[key] = val;
            }
        }
        if (cfg) {
            for (key in cfg) {
                if (cfg.hasOwnProperty(key)) {
                   val = cfg[key];
                   this[key] = val;
                }
            }
        }
    };

    this.reset = this.init;

    this.init();
};

这里.reset()只是上面的糖.init()
但是,如果您愿意,可以将默认值的应用程序和配置的应用程序分开,这样就可以.reset()忽略配置并只使用默认值...

有十亿种方法可以做到这一点,但这里有一种方法可以让您保持这个特定创建对象的私有状态,同时重置公开暴露的属性。

于 2013-01-05T22:41:49.487 回答