“孩子”的类型是什么?

时间:2016-12-17 04:49:00

标签: javascript backbone.js backbone-model

我知道对象和数组的类型。我知道如何使用以及如何创建对象和数组,但我不知道JavaScript中#include <iostream> #include <type_traits>
 template<class T> constexpr size_t len(T &a) { return sizeof(a) / sizeof(typename std::remove_all_extents<T>::type); } int main() { int a[5][4][3]{{{1,2,3}, {4,5,6}}, { }, {{7,8,9}}}; constexpr auto ttt = len(a); int i; std::cout << ttt << ' ' << len(i) << '\n';
 return 0; } 的类型以及如何创建child的类型?

这是一个镀铬控制台截图。

Chrome console 'child' object

3 个答案:

答案 0 :(得分:1)

它似乎是名为String equationAdd = et_roll1.getText().toString(); String equationSubtract = et_roll1.getText().toString(); String[]rollsAdd = equationAdd.split("\\+"); String[]rollsSubtract = equationSubtract.split("-"); for (String dieTypeAdd:rollsAdd) { for (String dieTypeSubtract:rollsSubtract){ String[] dieDataAdd = dieTypeAdd.split("d"); String[] dieDataSubtract = dieTypeSubtract.split("d"); if (dieDataAdd.length > 1) { int dieQty = Integer.parseInt(dieDataAdd[0]); int dieFace = Integer.parseInt(dieDataAdd[1]); for (int i = 0; i < dieQty; i++) { int roll = r.nextInt(dieFace); sumAdd += roll; } } else { int modifier = Integer.parseInt(dieDataAdd[0]); sumAdd += modifier; } if (dieDataSubtract.length > 1) { int dieQty = Integer.parseInt(dieDataSubtract[0]); int dieFace = Integer.parseInt(dieDataSubtract[0]); for (int i = 0; i < dieQty; i++) { int roll = r.nextInt(dieFace); sumSubtract -= roll; } } else { int modifier = Integer.parseInt(dieDataSubtract[0]); sumSubtract -= modifier; } }} 的自定义类的实例。

如果您在Chrome控制台中运行以下代码:

child

您会看到相同的输出,减去function child() {} new child(); 的所有属性:

Complex Roller Add

对于它的工作原理,通常命名约定是将child之类的构造函数的名称大写,但它在技术上并不是必需的。

答案 1 :(得分:1)

我同意mu is too short这很可能是Backbone.Model的一个实例,无论是直接还是间接(通过子类)。

您看到child的原因归功于Backbone的内部机制。当您使用Backbone.Model.extend时,backbone会为新类设置构造函数,此构造函数的名称为child。这在code for the .extend method中很容易看到。

从runtimme获得的某些有用的标识符很难,如果不是完全不可能的话。我已经养成了使用__classname__作为一个字段的习惯,我在该字段中输入了该类的名称。然后可以在我正在检查的对象的__proto__字段上看到它。我只将其用于调试目的。以下是Chrome控制台的示例:

Chrome console example

答案 2 :(得分:1)

由于@mu在查看对象属性方面太短correctly guessed,因此它是Backbone.Model的一个实例。你可以像这样创建同一个对象(类)的另一个实例,只要你知道正确的构造函数参数:

new child.constructor(...);

您也可以在新集合中使用模型(类),尽管您只能访问模型实例:

new MyCollection = Backbone.Collection.extend({
  model: child.constructor,
  ...
});

作为@Louis noted,除非您自己为对象原型添加一些名称,否则无法从对象实例中获取合理的(类)名称。我经常在模型中需要一些初始化代码,而不是将它放到initialize方法中,我声明命名构造函数显式并将初始化代码放在那里。就像这里名为MyModel的函数一样:

var MyModel = Backbone.Model.extend({
  constructor: function MyModel(attributes, options) {
    Backbone.Model.prototype.constructor.call(this, attributes, options);
    ...
  }
});

您可以在Chrome开发者工具中看到对象(类)名称,如下所示:

var Car = Backbone.Model.extend({
  constructor: function Car(attributes, options) {
    Backbone.Model.prototype.constructor.call(this, attributes, options);
  }
});

var Truck = Car.extend({
  constructor: function Truck(attributes, options) {
    Car.prototype.constructor.call(this, attributes, options);
  }
});

Truck object instance

__classname___这样的字符串属性也可以在缩小的代码中保持不变。命名构造函数仅在非缩小代码中可用。如果在缩小代码后仍需要查看有意义的构造函数名称,则必须exclude them from mangling