0

这是我的代码:

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];

box 是对象,box01.area => box 有 area 属性

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

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

我怎样才能在 defineProperties 中找到它

4

3 回答 3

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)
于 2012-12-27T20:41:25.080 回答
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是为了让这些属性可以在原型的实例方法中访问。

于 2012-12-27T19:59:04.697 回答
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());
于 2017-12-06T07:25:52.013 回答