私はJavaScriptを学んでいます(最新のGoogle Chromeを使って64ビットDebian Jessieをビルドしています)、今、私はちょうどObject.defineProperty
がどのくらい正確に動作しているか理解していません。私はconsole.log(...)
内のプロパティを使用しようとするラインでUncaught TypeError: Cannot read property 'fullName' of undefined
を得るObject.defineProperty - オブジェクトを返す関数内のスコープと使用?
function createPerson() {
var person = {
firstName: 'Lilly',
lastName: 'Louis',
};
Object.defineProperty(person, 'fullName', {
get: function() {
return this.firstName + ' ' + this.lastName;
},
set: function(name) {
var words = name.split(' ');
this.firstName = words[0] || '';
this.lastName = words[1] || '';
}
});
}
var p1 = createPerson();
console.log("Person's default name is \"" + p1.fullName + "\"");
:私は以下のページを持っています。関数の外にObject.defineProperty
と一緒にperson
という定義を置くと、すべて正常に動作します。私はp1
後に関数の外のみObject.defineProperty
を移動した場合、次のように作成されます。
var p1 = createPerson();
Object.defineProperty(p1, 'fullName', {
get: function() {
return this.firstName + ' ' + this.lastName;
},
set: function(name) {
var names = name.split(' ');
this.firstName = names[0] || '';
this.lastName = names[1] || '';
}
});
は、私は、コンソールは、それが(anonymous function)
(つまりp1
です)さらに混乱している時に呼び出されていることを指摘続いUncaught TypeError: Object.defineProperty called on non-object
を取得私がを私のp1
にブラケットなしで代入すれば、関数オブジェクトをそれに渡します。それ以外の場合は、関数自体を呼び出して戻り値を代入しています(返り値がない場合未定義が返されます)。 p1
。
私は両方の問題が完全に別々であると感じていますが、私は同じ質問に両方を入れることを100%確信していないからです。私がここで間違っていることについて何かアドバイスはありますか?私は単に
function createPerson() {
var person = {
firstName: 'Lilly',
lastName: 'Louis',
getFullName: function() {
return ...;
}
setFullName: function(name) {
...
}
};
}
を行うことで、私のgetter
とsetter
昔ながらの方法を定義することができますが、私はここで何が起こっているのかを理解したいと思います。 :D
の周りにコードを移動しながら、手のひらを顔に当てる* *キリスト、私は(ここに)私のコードでそれを削除しました。だから私の愚かな...それを指摘してくれてありがとう。 – rbaleksandar