【问题标题】:array as data member in a class javascript数组作为类 javascript 中的数据成员
【发布时间】:2014-11-08 17:58:34
【问题描述】:

我是面向对象 javascript 的新手,我试图定义一个类,它有一个数组作为数据成员。这个类的数据成员将另一个类的对象存储为一个数组。

这个例子会更清楚

function classA(id, objB_01)
{

    this.id = id;   // data member that store a simple value
    this.arrayname = objB_01  // How multiple instance of classB is stored in this array 


}

function classB( id, name, status)
{
     this.id = id;
     this.name = name;
     this.status = status 
}

objB_01 = new classB("01", "john", "single");
objB_02 = new classB("02", "smith" "single");
objB_03 = new classB("03", "nina", "married");

现在我的问题是我如何编写classA 以便classA 的单个实例保存一个存储classB 的多个对象的数组

像这样的

objA = new classA("01",objB_01);
objA.arrayname = objB_02;
objA.arrayname = objB_03;

现在终于objA包含一个字符串和一个数组,存储多个B类对象

请指出正确的方向

【问题讨论】:

    标签: javascript jquery object-oriented-analysis


    【解决方案1】:

    一个选项可以是在构造函数中初始化一个空数组,也可以有一些方法将对象添加到数组中。

    function classA (id) {
        this.id = id;
        this.array = [];
    
        this.add = function (newObject) {
            this.array.push(newObject);
        };
    }
    

    那么你可以这样做:

    objA = new classA("01");
    objA.add(objB_01);
    objA.add(objB_02);
    objA.add(objB_03);
    

    【讨论】:

      【解决方案2】:

      深入研究 JavaScript Arrays 周围的规范文档可能会有所帮助。

      除此之外,要回答您关于拥有一个 classA 的问题,其中一个实例具有多个 classB 实例的数组 - 我相信您正在寻找数组方法 .push()

      同样,您可能希望利用 JavaScript 的标准重载构造函数模式来增强您的类定义。

      类似的东西

      function classA(id, objarray)
      {
      
          this.id = id;   // data member that store a simple value
          this.arrayname = objarray || []; //if objarray isn't passed it'll initiate an empty array 
      }
      function classB( id, name, status)
      {
           this.id = id;
           this.name = name;
           this.status = status 
      }
      
      objB_01 = new classB("01", "john", "single");
      objB_02 = new classB("02", "smith" "single");
      objB_03 = new classB("03", "nina", "married");
      
      var objBarray = [objB_01, objB_02, objB_03];
      
      //now you can use construct & initiate classA in two different ways
      //Push each object individually
      var objA = new classA("01");
      objA.arrayname.push(objB_01);
      objA.arrayname.push(objB_02);
      objA.arrayname.push(objB_03);
      
      //or push the entire list at once
      var objA = new classA("01", objBarray);
      

      【讨论】:

      • 当我们没有任何classB obj 时,为了初始化classA obj,您的代码比其他任何代码都更真实。所以我们可以在此之后添加classB 对象
      【解决方案3】:

      试试

              var data = {};
      
              var classData = function (id, name, status, options) {
                  if (options) {
                      this.id = options.id;
                      this[options.arrayname] = [];
                  };
                  if (!this.hasOwnProperty("id")) {
                      throw new Error("No id set on `classData` array."
                      + "Please set `id` for `classData` at `options` object")
                  };
                  var j = (id && name && status) ? JSON.stringify({
                      id: id,
                      name: name,
                      status: status
                  }) : false;
                  j ? this[Object.keys(this).filter(function (v) {
                      return v !== "id"
                  })[0]].push(JSON.parse(j)) : null;
                  return this
              }.bind(data);
              // set `id` at `data` , 
              // add first item to `data.arrayname` 
              classData("01", "abc", "single", {"id":"01", "arrayname":"files"});
              // set data at `data`
              classData("02", "def", "married");
              classData("02", "ghi", "single");
              // read `classData`
              console.log(classData());
      

              var data = {};
              
              var classData = function (id, name, status, options) {
                  if (options) {
                      this.id = options.id;
                      this[options.arrayname] = [];
                  };
                  if (!this.hasOwnProperty("id")) {
                      throw new Error("No id set on `classData` array."
                      + "Please set `id` for `classData` at `options` object")
                  };
                  var j = (id && name && status) ? JSON.stringify({
                      id: id,
                      name: name,
                      status: status
                  }) : false;
                  j ? this[Object.keys(this).filter(function (v) {
                      return v !== "id"
                  })[0]].push(JSON.parse(j)) : null;
                  return this
              }.bind(data);
              // set `id` at `data` , 
              // add first item to `data.arrayname` 
              classData("01", "abc", "single", {"id":"01", "arrayname":"files"});
              // set data at `data`
              classData("02", "def", "married");
              classData("02", "ghi", "single");
              // read `classData`
              console.log(classData());

      【讨论】:

      • 现在我明白了如何使用hasOwnProperty来检查核心数据成员是否会被检查。
      猜你喜欢
      • 1970-01-01
      • 2015-05-11
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多