Вы не можете сделать это, используя литерал объекта.this
относится к person
после литерал оценивается, во время оценки this
относится к родительской области.Вы можете обернуть конструкцию объекта в функцию, чтобы быть уверенным, что this
ссылается на текущую область (т. Е. Область функции).Что-то вроде:
var person = function(){
this.name = 'John';
this.__test__ = (function(){alert(this.name);}());
return this;
}();
Или используя переменные внутри области действия функции:
var person = function(){
var _name = 'John'
,_test = (function(){alert(_name);}());
return { name: _name, __test__: _test };
}();
Или обернуть вещи в более общую фабричную функцию:
function objFactory(obj){
var nwObj = {};
for (var l in obj){
if (obj.hasOwnProperty(l)){
if (obj[l] instanceof Function && /^auto_/i.test(l)){
nwObj[l.replace(/^auto_/i,'')] = obj[l].call(nwObj);
}
else {
nwObj[l] = obj[l];
}
}
}
return nwObj;
}
//=> usage
var person = objFactory(
{ name: '',
auto_name: function(){
this.name='John';
return this.name;
}
}
);
alert(person.name); //=> John
И, наконец,(не все с этим согласятся) вы можете создать обработчик загрузки в Object.prototype
:
Object.prototype.load = function(){
for (var l in this){
if (this.hasOwnProperty(l)
&& this[l] instanceof Function
&& /^auto_/i.test(l)) {
this[l].call(this);
delete this[l];
}
}
return this;
}
//=> usage
var person = {
name: '',
auto_name: function(){this.name='John';}
}.load();
alert(person.name); //=> John