将Javascript类重置为其默认值

将Javascript类重置为其默认值,javascript,class,Javascript,Class,这是一个相当愚蠢的问题,但我之前一直在随机思考这个问题,我从来没有尝试过这么做。。。假设我有一门课是这样的: function Drug () { this.name = ''; this.type = ''; } 在后面的页面中,我为该药物设置了一些值: var drug = new Drug(); drug.name = 'Testing'; drug.type = 'TestType'; 有没有一种简单的方法可以让我们假设重新启动此药物实例到其默认值,而不必执行以下操作: va

这是一个相当愚蠢的问题,但我之前一直在随机思考这个问题,我从来没有尝试过这么做。。。假设我有一门课是这样的:

function Drug () {
  this.name = '';
  this.type = '';
}
在后面的页面中,我为该药物设置了一些值:

var drug = new Drug();
drug.name = 'Testing';
drug.type = 'TestType';
有没有一种简单的方法可以让我们假设重新启动此药物实例到其默认值,而不必执行以下操作:

var drug2 = new Drug();
像某种类型的reset函数一样,我可以在
Drug
内部创建,只需执行
Drug.reset()


我试过了:
this.clear=function(){return new Drug();}
但那没用……

你想得有点过头了。不要直接在构造函数中初始化这些属性,而是创建一个由构造函数调用的初始化它们的
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: ""}

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

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

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 );

您可以在这里亲自尝试:

在类中提供公共可访问属性的一种相当普遍的形式

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

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()
就可以忽略配置,而只使用默认值


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

Drug.call(Drug)
做什么?啊,非常正确!是的,我想我想得太多了,哈哈。我从来没有这样做过,只是出于好奇我试过,我意识到我不能那样做!非常感谢,现在有意义了。非常好,我喜欢它!有没有理由把原型放在它自己的自动执行功能中?看起来是个好主意!它允许您通过更改参数(
druge
,在本例中)来复制此代码,以供其他重用。所以它也可以封装成一个外部函数哦,非常好,肯定会有帮助!
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: ""}