new
関数が返すキーワードを使用する場合、デフォルトではreturnを使用しないでthis
ください。関数の宣言方法を変更する必要があります。
これがフィドルです
http://jsfiddle.net/SaintGerbil/9SAhD/
function Person(name){
this.name = name;
this.hello = function (){
alert("hello " + this.name);
}
}
var newPerson = new Person("john");
newPerson.hello();
名前を非公開にする必要がある場合は編集してください。
function Person(name){
var _name = name;
this.hello = function (){
alert("hello " + _name);
}
}
var newPerson = new Person("john");
newPerson.hello();
あなたの質問に答えて、関数を呼び出す4つの方法がありますこれらはthis
それらの価値に影響を与えます
- コンストラクター呼び出し(
new
キーワードを使用)ここthis
で、は自動的に返される新しいオブジェクトです。
- 関数がオブジェクトにアタッチされ、そこから呼び出された場合のメソッド呼び出しは、から
this
呼び出されたオブジェクトです。
- 関数を呼び出す関数を直接呼び出すと
this
、グローバルオブジェクトになります(newなしでコンストラクターを呼び出す場合のよくある間違い)
- メソッドを使用してこれを指定する場合は、Apply \ Call呼び出し(例としてjackwandersを参照)
さらに編集
したがって、最初に目的のコードを取得して、何が起こっているのかを説明します。
function Person(name){
this.name = name; // 1
function hello(){ // 2
alert("hello " + this.name); // 3
}
return {
hello: hello
}; //4
}
関数としての人は、 2つの方法で呼び出すことができます。
var x = Person("ted");
と
var x = new Person("jimmy");
大文字でPersonに名前を付けたので、それは人々が使用することを期待していることを意味しますnew
。
したがって、これに固執して関数を入力すると、javascriptが新しいオブジェクトを作成し、それをに割り当てますthis
。
- 1行目では、「name」変数をアタッチ
this
し、渡されたパラメーターで初期化します。
- 2行目では、「hello」関数をにアタッチし
this
ます。
- 3行目、関数はこれに「name」変数が付加されていることを想定しています(今のところこれはそうです)。
- 4行
this
目(デフォルトの動作)ではなく、新しいオブジェクトを宣言し、それに関数をアタッチしています。この新しいオブジェクトには、スコープ内に「name」変数がありません。
したがって、オブジェクトを作成すると、関数がアタッチされたオブジェクトが取得されますが、正しく実行する必要がある変数に到達できません。それがあなたが未定義を取得している理由です。
テキストボックスを展開する必要があるときに、私が困惑していることを常に心配しているのは理にかなっていますか?
または、関数をできるだけ詳細に書き出すと、次のようになります。
function Person(name){
var this = new Object();
this.name = name;
var hello = function (){
alert("hello " + this.name);
}
this.hello = hello;
var that = new Object();
that.hello = hello;
return that;
}