将数组传递给Constructor函数并将其保持公开

时间:2012-12-27 19:45:12

标签: javascript oop

这是我的代码:

var BoxUtility = function() {
    var boxList = Array.prototype.pop.apply(arguments);
};

Object.defineProperties(BoxUtility, {
    totalArea: {
        value: function(){
           var x = 0;
           for(var i = 0, len = boxList.length; i <= len - 1; i++){
              x = x + boxList[i].area;
           };
        return x;
        }
     }
});

我试图为我的代码实现此语法:

var boxArray = [box01, box02, box03];

框是对象,box01.area =&gt;盒子有区域属性

var newElement = new BoxUtility(boxArray);
alert(newElement.totalArea);

我想看到我预期的结果,但我认为boxList在另一个范围

如何在defineProperties

中访问它

3 个答案:

答案 0 :(得分:0)

您必须在构造函数中将值赋给this的属性。

var BoxUtility = function() {
    // this.boxList
    this.boxList = Array.prototype.pop.apply(arguments);
};

// instance methods go on the prototype of the constructor
Object.defineProperties(BoxUtility.prototype, {
    totalArea: {

        // use get, instead of value, to execute this function when
        // we access the property.
        get: function(){
           var x = 0;

           // this.boxList
           for(var i = 0, len = this.boxList.length; i <= len - 1; i++){
              x = x + this.boxList[i].area;
           };
           return x;
        }
     }
});

var boxUtil = new BoxUtility([{area:123}, {area:456}]);
console.log(boxUtil.totalArea); // 579

变量范围总是function级别。所以你声明了一个只能在你的构造函数中使用的局部变量。但是每次调用构造函数时,都会得到一个新对象(this)。您可以向this添加属性,以便在原型的实例方法中访问这些属性。

答案 1 :(得分:0)

这是有效的

var BoxUtility = function() {
this.boxList = Array.prototype.pop.apply(arguments);
Object.defineProperties(this, {
    totalArea: {
        get: function(){
        var x = 0;
        for(var i = 0, len = this.boxList.length; i <= len - 1; i++){
            x = x + this.boxList[i].area;
        };
        return x;
        }
    }
});};


var y = new BoxUtility(boxArray);
alert(y.totalArea)

答案 2 :(得分:0)

这是在构造函数中将数组作为参数传递并为公共访问声明函数原型的简单方法。

 function BoxUtility(boxArray) {
     this.boxArray = boxArray;
     this.len = boxArray.length;

  }
 Color.prototype.getAverage = function () {
      var sum = 0;
      for(let i = 0;i<this.len;i++){
       sum+=this.boxArray[i];

  }
   return parseInt(sum);
};

var red = new BoxUtility(boxArray);

alert(red.getAverage());
相关问题