Javascript使用现有对象属性创建对象属性

时间:2011-10-21 18:10:53

标签: javascript

这就是我想做的事情

var myObject = {
  prop: "872349827194721934798",
  calcProp: (this.prop.length % 3),
  method1: function () { return this.calcProp; },
  method2: function () { return this.calcProp - 1; }
}

但是它会返回错误“this.prop is undefined”

以下作品:

var myObject = {
  prop: "872349827194721934798",
  calcProp: function () {this.prop.length % 3;},
  method1: function () { return this.calcProp(); },
  method2: function () ( return this.calcProp() - 1;}
}

现在,calcProp的使用是myObject.calcProp()' and I want the usage to be myObject.calcProp`。我知道这会奏效。

var myObject = {
  init: function () { this.calcProp = this.prop.length % 3; },
  prop: "872349827194721934798",
  calcProp: null,
  method1: function () { 
    this.init();
    return this.calcProp; 
  },
  method2: function () { 
    this.init();
    return this.calcProp - 1;
  }
}

有没有办法实现calcProp,其用法为Object.calcprop。不调用init()

已编辑 - 附加要求


注意:应该添加到我的要求中,我想尽量避免修改初始定义之外的属性。我不想做以下事情;

var myObject = {
  prop: "872349827194721934798",
  method1: function () { return this.calcProp; },
  method2: function () { return this.calcProp - 1; }
};
myObject.calcProp = (myObject.prop.length % 3);

我想在初始定义中保留所有内容。

5 个答案:

答案 0 :(得分:3)

var myObject = {
  prop: "872349827194721934798",
  method1: function () { return this.calcProp; },
  method2: function () { return this.calcProp - 1; };
};
myObject.calcProp = (myObject.prop.length % 3);

或者允许内联完成,写一个帮手:

function alloc(init) {
    var o = {};
    init.call(o);
    return o;
}

你现在可以说:

var myObject = alloc(function() {
   this.prop = "872349827194721934798";
   this.calcProp = (this.prop.length % 3);
   this.method1 = function () { return this.calcProp; };
   this.method2 = function () { return this.calcProp - 1; };
});

答案 1 :(得分:1)

var myObject = {
  prop     : "872349827194721934798",
  get calcProp(){ return this.prop.length % 3; },
  method1  : function () { return this.calcProp; },
  method2  : function () { return this.calcProp - 1; }
};



使用示例: console.log(myObject.calcProp);

注意: get是在ECMAScript5 / Harmony中引入的,所以如果JS引擎没有在旧浏览器上更新,它可能不会在这些情况下工作。有关旧版浏览器的更多支持,请参阅Daniel's solution

答案 2 :(得分:0)

您必须先创建对象,然后才能访问其成员。

var myObject = { 
  prop: "872349827194721934798", 
  method1: function () { return this.calcProp; }, 
  method2: function () { return this.calcProp - 1; } 
};
myObject.calcProp = myObject.prop.length % 3; 

在对象文字表达式的上下文中,this引用表达式的上下文 - 可能是window。您收到一个未定义的错误,因为您当前的上下文不包含prop属性。如果上下文具有名为prop的成员,则将使用该值:

var prop = [];
var myObject = {
  prop: "872349827194721934798",    
  calcProp: (this.prop.length % 3),    
  method1: function () { return this.calcProp; },    
  method2: function () { return this.calcProp - 1; }    
};
myObject.calcProp; // 0 (ie, [].length % 3)

编辑:您不需要访问该属性,只需使用相同的值即可。例如:

var myObject = {
  prop: "some literal string",
  calcProp: "some literal string".length % 3
};

var myObject = {
  prop: someVariable,
  calcProp: someVariable.length % 3
};

或者,这是另一种方法:

function SomeObj(prop) {
    this.prop = prop;
    this.calcProp = this.prop.length % 3;
}
SomeObj.prototype.method1 = function () { return this.calcProp; };
SomeObj.prototype.method2 = function () { return this.calcProp - 1; };

var myObject = new SomeObj("872349827194721934798");

答案 3 :(得分:0)

您别无选择,只能按部件进行初始化

var obj = { prop: ... };
obj.calcProp = ...

你可以使用一些技巧仍然能够内联写这个:

//the module pattern allows for inline statements
var fullObj =(function(){
    var obj = { prop: ... };
    obj.calcProp = ...
    return obj;
}());

//a constructor function gives you unlimited power:
function init(obj){
    obj.calcProp = ...
    return obj;
}
var something = init({
    prop: "123"
    ...
});

答案 4 :(得分:0)

这与其他答案几乎相同:

 var propVal = "872349827194721934798";
    var myObject = {
      prop: propVal ,
      calcProp: (propVal.length % 3),
      method1: function () { return this.calcProp; },
      method2: function () { return this.calcProp - 1; }
    }