之后可以在现有对象中添加构造函数吗?有意义吗?

时间:2014-07-14 12:06:43

标签: javascript design-patterns

假设有一个类似的结构:

var Foo = {
    someVar : 13,
    someMessage : function () {
        return "Hello";
    }
};

我想在Foo之外添加一个构造来初始化someVar,以便可以采取以下行动:

var foo = new Foo (someVar);

我知道所谓的构造函数调用模式(我实际上并不是在寻找,但我也在这里提出一个问题):

var Foo = function (someVar) {
    this.someVar = someVar;
};

Foo.prototype.getSomeVar = function () {
    return this.someVar;
};

var foo = new Foo ("some content");

console.log (foo.getSomeVar());

如何在Foo之外的Foo中添加属性(someSecondVar)?

3 个答案:

答案 0 :(得分:1)

附加属性很简单,就像将函数附加到构造一样:

Foo.prototype.someSecondVar = 0;
Foo.prototype.someThirdVar = "blah";

答案 1 :(得分:0)

不幸的是,你无法在JavaScript中实例化对象文字(与其他编程语言的比较不起作用)。这可能是一个好主意,你可以节省一些文书工作。

"构造函数调用模式"尝试正确的方向,你可以这样简单地添加一个属性:

Foo.prototype.someSecondVar = "what ever";

编辑:你不能实例化一个对象文字,但你可以创建一个新对象并选择该对象,该对象应该是它的原型(来自Douglas Crockford):

请研究以下示例:

var Person = {
    "name" : "Max",
    "age" : 30,
    "children" : ["Susi", "Ben"]
};

Object.create = function (obj) {
    var F = function () {};
    F.prototype = obj;
    return new F();
};

var Person2 = Object.create(Person);
Person2.name = "John";
Person2.age = 40;
Person2.children = ["Sara"];

Person.city = "New York";

console.log(Person2);

输出显示了两件重要的事情:

  1. 新对象具有旧版本的所有属性
  2. 如果之后向旧对象添加一些属性,则newones会自动获取
  3. Object.Create -> The output

答案 2 :(得分:0)

您可以使用对象的.prototype来完成您想要做的事情。请记住,改变原型通常在计算上是昂贵的,并且它还会改变所有对象,这些对象是您正在改变的原型对象的实例,可能是您想要的也可能不是。

你可以像Husman在答案中提到的那样添加一个属性。

如果你真的需要实例化它并且不能只使用自定义函数放置一个值,请查看getter和setter:MDN

通过使用getter / setter,您可以为需要属性值的任何情况添加一些条件,从而以某种方式模拟构造函数。

总的来说,我建议重新考虑你的代码结构。如果您想要做的事情非常复杂,并且如果您重新考虑您的代码通常没有必要,那么这些方法通常只能是合理的。