Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化JavaScript对象及其属性数组的好方法?_Javascript - Fatal编程技术网

初始化JavaScript对象及其属性数组的好方法?

初始化JavaScript对象及其属性数组的好方法?,javascript,Javascript,我知道我可以初始化一个JS对象数组,如下所示: var things = [ { prop1: 'foo', prop2: 'bar' }, { prop1: 'foo', prop2: 'bar' } ]; 我想我会将这些类型称为“匿名”类型(对不起,我使用的是C#/.NET语言) 如果我希望这些是同一个原型呢?所以我定义了一个构造函数: var Thing = function Thing() { }; Thing.prototype.pr

我知道我可以初始化一个JS对象数组,如下所示:

var things = [
  {
    prop1: 'foo',
    prop2: 'bar'
  },
  {
    prop1: 'foo',
    prop2: 'bar'
  }
];
我想我会将这些类型称为“匿名”类型(对不起,我使用的是C#/.NET语言)

如果我希望这些是同一个原型呢?所以我定义了一个构造函数:

var Thing = function Thing() {
};

Thing.prototype.prop1 = 'default value';
Thing.prototype.prop2 = 'default value';
现在我希望上面原始代码中的两个项目都是
Thing
s。有什么好办法吗

如果我猜的话,我会说:

var things = [
  new Thing() {
    prop1: 'foo',
    prop2: 'bar'
  },
  new Thing() {
    prop1: 'foo',
    prop2: 'bar'
  }
];
这基本上是C#对象初始值设定项语法。我试图避免的是:

var thing1 = new Thing();
thing1.prop1 = 'foo';
thing1.prop2 = 'bar';
var thing2 = new Thing();
thing2.prop1 = 'foo';
thing2.prop2 = 'bar';
var things = [thing1, thing2];

编辑:

我还应该注意,我的原型还包含一些共享的函数。实际上,我的数组嵌套了3层,所以更像:

{
   [
    { 
      [
        {},
        {}
      ]
    },
    {
      [
        {},
        {}
      ]
    }
  ]
}

这就是为什么我希望像这样内联初始化所有内容,而不是一行一行地设置每个属性。

下面的方法可能有效,这也是您希望避免的吗

var thing1 = new Thing();
var thing2 = new Thing();

thing1.prototype = {
    prop1: "foo",
    prop2: "bar"
};

thing2.prototype = {
    prop1: "foo",
    prop2: "bar"
};
我能想到的另一件事是自己制作构造函数,这样它就可以允许如下内容:

var things = [
    new Thing({
        prop1: "foo",
        prop2: "bar"
    }),
    new Thing({
        prop1: "foo",
        prop2: "bar"
    })
];

您没有使用您的“构造函数”。首选在构造函数中初始化值:

var Thing = function Thing(prop1, prop2) {
    this.prop1 = prop1;
    this.prop2 = prop2;
};
然后做:

var thing1 = new Thing("foo", "bar");
var thing2 = new Thing("foo", "bar");
在这种情况下,我向对象添加了一个“config”方法:

function Thing() {
}
Thing.prototype.prop1 = 'foo';
Thing.prototype.prop2 = 'bar';
Thing.prototype.config = function(data) {
    for (var i in data)
        if (data.hasOwnProperty(i))
            this[i] = data[i];
}

var array = [
    new Thing().config({
        prop1: 'foobar',
        prop2: 'barfoo'
    })
];

这不会改变每个对象实例所基于的原型吗?原型也有一些共享的函数,所以它不会也失去它们吗?@CodingWithSpike是的,它会=/你不能更改实例的原型。构造函数具有
.prototype
属性,该属性引用使用此构造函数创建的对象的隐藏
[[prototype]]]
属性。您无法(以标准方式)更改此属性,因此第一个代码段所做的是将名为
prototype
的属性添加到必须由
thing1.prototype.prop1
访问的实例中,而
thing1.prop1
thing1.prop1
无关,但这有点奇怪,因为我的一些属性也是数组,所以我最终得到了类似的东西:
newone(“foo”),[newtwo([new Three(),new Three()]),newtwo([new Three(),new Three()]),“bar”)
,看起来很难看。我想你可能是对的。为了可读性,我想我只是想保留属性名。@CodingWithSpike,如果你在创建一个新类时遇到了麻烦,你应该确定你已经为该类上的方法准备了一个用例。否则,最好使用对象和数组文字。此外,大量静态数据最好作为JSON数据源。拥有
.config()
和在构造函数本身中实现有什么区别吗<代码>函数Thing(data){for(vari in data)…}这基本上是@alcidesqueroz answer。主要区别在于,在构造函数上实现它时,每次创建
对象时,都会在对象上执行迭代,不管您是否需要它,使用
.config()
method您会隐式地要求它。此外,您可以将方法
.config()
添加到任何现有类中(但我不建议您扩展本机类型),并将其标记为答案,因为它在我的情况下工作得最好。它还允许我执行可选属性,如:
function Thing(params){this.name=params.hasOwnProperty(“name”)?params.name:“一些默认”}
function Thing() {
}
Thing.prototype.prop1 = 'foo';
Thing.prototype.prop2 = 'bar';
Thing.prototype.config = function(data) {
    for (var i in data)
        if (data.hasOwnProperty(i))
            this[i] = data[i];
}

var array = [
    new Thing().config({
        prop1: 'foobar',
        prop2: 'barfoo'
    })
];