2016-12-17 122 views
1

我知道对象和数组的类型。我知道如何使用以及如何创建Object和Array,但我不知道JavaScript中的child的类型以及如何创建child的类型?'孩子'是什么类型?

这是一个Chrome控制台的屏幕截图。

Chrome console 'child' object

+1

你是如何在控制台中获得该对象的?结构和骨干标签表明它是某种“Backbone.Model”。 –

+0

是的即时通讯使用Backbone.Model .. – jasondayee

+1

并且在输出后面有一些'console.log(something_you_are_not_showing_us)',对吧? –

回答

1

这似乎是一个名为child自定义类的一个实例。

如果您在Chrome的控制台运行下面的代码:

function child() {} 
new child(); 

你会看到相同的输出,减去所有的child属性:

screenshot

对于它的工作,通常命名约定是大写构造函数的名字,如Child,但这在技术上并非必要。

+0

谢谢,我明白了。 – jasondayee

1

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

你看到child的原因是由于骨干网内部的机械。当您使用Backbone.Model.extend时,主干会为新类建立构造函数,并且此构造函数的名称为child。这在code for the .extend method中很容易看到。

获得某种有用的标识出你在runtimme什么是困难的,如果不是完全不可能的。我已习惯于使用__classname__作为一个领域,在这个领域中我将班级的名字夸大了。然后在我正在检查的对象的__proto__字段中可见。我仅将它用于调试目的。下面是在Chrome的控制台一个例子:

Chrome console example

1

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

new child.constructor(...); 

你也可以使用一个新的集合模型(类),虽然你刚刚到访问模型实例:

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

由于@Louis noted,则无法得到合理的(类)的名字在一个对象实例的,除非你把一些名字到对象原型自己。我经常需要在我的模特一些初始化代码,而不是把它给initialize方法,我声明名为constructor明确并把初始化代码出现。就像命名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