如何计算构造函数javascript中的对象数

时间:2015-04-15 21:06:15

标签: javascript

我正在使用javascript,想知道构造函数中的对象数量。

我有这个:

var EventData = function(ID, Name, StartDate, StartTime, EndDate, EndTime, Location, Notes){
  this.type = "event";
  this.id = ID;
  this.name = Name;
  this.startDate = StartDate;
  this.startTime = StartTime;
  this.endDate = EndDate;
  this.endTime = EndTime;
  this.location = Location;
  this.notes = Notes;
};
EventData.prototype.count = function(){
  return //some code;
};

我想打电话给这样的话:

var Start = function(){
  var thisEventData = new EventData(1,"Bill", 1,1,1,1, "Home", "N/A");
  console.log(thisEventData.count());
};

thisEventData.count()返回10。

4 个答案:

答案 0 :(得分:6)

在这种情况下,最自然的方法是将参数计数存储在某些属性中(可能是私有的)。我不确定你为什么需要这个,但是,是的,就像这样:

var EventData = function (ID, Name, StartDate, StartTime, EndDate, EndTime, Location, Notes) {
    this._paramsCount = arguments.length;
    this.type = "event";
    this.id = ID;
    this.name = Name;
    this.startDate = StartDate;
    this.startTime = StartTime;
    this.endDate = EndDate;
    this.endTime = EndTime;
    this.location = Location;
    this.notes = Notes;
};
EventData.prototype.count = function () {
    return this._paramsCount;
};

UPD。根据已编辑的问题,看起来您想要计算实例的自有属性数。在这种情况下,您将使用方便的Object.keys方法返回一个属性名称数组。

EventData.prototype.count = function () {
    return Object.keys(this).length;
};

答案 1 :(得分:3)

只需将EventData对象的属性作为带Object.keys的数组,然后获取数组的长度?

EventData.prototype.count = function(){
  return Object.keys(this).length;
};

答案 2 :(得分:3)

如果您想知道规范参数的数量,请使用Function.length属性,在您的情况下:

EventData.length

thisEventData.constructor.length

请注意,它不会计算其他参数(变量参数),因为它会从构造函数对象中推断出计数。

如果您想知道构造对象的属性数,请使用Object.keys

Object.keys(thisEventData).length

这将为您提供自己的属性的计数(不包括原型链)。

或者,如果您需要其他内容,只需编写自己的可自定义逻辑,例如,如果您需要非虚假对象:

function getPropertyCount(obj, withPrototypeChain) {
    var prop;
    var count = 0;

    for (prop in obj) {
        if ((withPrototypeChain || obj.hasOwnProperty(prop)) && obj[prop])
            ++count;
    }

    return count;
}

答案 3 :(得分:0)

要在已接受的答案基础上做些努力:

export class Person {
      constructor (name, age) {
        if (arguments.length !== 2) {
          throw new Error('invalid Person argument count')
        }
        this.name = name
        this.age = age 
      }
    }