2017-01-16 5 views
1

の内側に、私は犬コンストラクタを持っているのアクセス。出力では、次のように「これは」コンストラクタで独立した機能

var dogObj = new Dog("hj","labrador"); 
alert(dogObj()); 

、私は警告メッセージボックスに「結果」として取得し、私はO/P「結果を」何得ていないのです、意味?

私は意図的に別の「これは」作成されるので、それは私がアクセスretfunc()内部this.nameをカント意味し、「この」オブジェクトにretfuncを含めていませんか?

私はまた、var self =thisを割り当てることで問題が解決されるという事実にも気づいています。 私はちょうど "結果"が何であるか知りたかったのですが、それはなぜ出力されていないのですか?undefined理想的には?

+2

あなたが返される関数を実行する方法は、グローバルwindowオブジェクトを参照してくださいthis' 'なりますので、あなたが実際に'の名前を含むウィンドウプロパティですwindow.name'を取得AE窓 –

答えて

2

この問題は、機能内のthisのスコープがwindowになるためです。またあなたはしかし、あなたがあなたを変更する必要があり、thisの範囲を維持するための機能をprototypeでき

var Dog = function(name, type) { 
 
    var _this = this; 
 
    
 
    this.name = name; 
 
    this.type = type; 
 
    
 
    this.normalObjFunc = function() { 
 
     _this.name = "kl"; 
 
    } 
 
    
 
    var retfunc = function() { 
 
     return _this.name; 
 
    } 
 
    return retfunc; 
 
} 
 

 
var dogObj = new Dog("hj", "labrador"); 
 
console.log(dogObj());

:あなたは変数にオブジェクト参照をキャッシュし、それを呼び出して、次のようにする必要がありますこれは戻り値Dog()が関数ではないことを意味します。

var Dog = function(name, type) {   
 
    this.name = name; 
 
    this.type = type; 
 
} 
 

 
Dog.prototype.normalObjFunc = function() { 
 
    this.name = "kl"; 
 
} 
 
Dog.prototype.retfunc = function() { 
 
    return this.name; 
 
} 
 

 
var dogObj = new Dog("hj", "labrador"); 
 
console.log(dogObj.retfunc());

関連する問題