这就是我想做的事情
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);
我想在初始定义中保留所有内容。
答案 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; }
}