あなたは、オブジェクトリテラルを使用してこれを行うことはできません。 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
私のために定義されています。どのような設定を使用していますか? – Blender
コードの意味は? – gdoron
@gdoron私の更新を参照 – user310291