2017-01-07 19 views
-2

JSをよく理解しようとすると、いくつかの説明があります。名前が外部に表示されていない理由は?、我々は(customer.name)その未定義にログインしたとき、我々は機能に括弧を初期化し、自己を削除し、(に変数の宣言を変更しかし、もし私たちは次のような方法JavaScript自己呼び出し関数のプロパティ

var customer = function(){ 
      var name = "Contoso"; 
      return { 
       getName : function(){ 
        return this.name; 
       }, 
       setName : function(newName){ 
        this.name = newName; 
       } 
      } 
     }(); 

があるとしましょうthis.name)&再びログを記録すると値を見ることができます。私はここで何が欠けているのですか?

答えて

0

varは、関数のスコープ内で変数を作成していますが、これは関数のプロパティとして外部では使用できません。 customer.nameのようなプロパティにアクセスする場合は、気付いた通りにthis.nameとして初期化する必要があります。

varこの例の関数は、関数では変更できますが、直接変更することはできません。

SOこれは動作します:

var customer = function(){ 
    var name = "Contoso"; 
    return { 
     getName : function(){ 
      return name; 
     }, 
     setName : function(newName){ 
      name = newName; 
     } 
    } 
}(); 
+2

2番目の例は、 'this'に' name'を定義して別のオブジェクトを 'return'するので動作しません。この関数をコンストラクタとして使用する場合は、 'this.getName = ...'または 'customer.prototype.getName = ...'を定義し、 'return'を削除する必要があります。そして、あなたは 'new'キーワードで関数を呼び出さなければなりません。現時点では、 'this'はグローバルオブジェクトを指し、' this.name'は 'window'に追加されます – Thomas

+0

ありがとうございます@トーマス。あなたが正しいです。 2番目の例を削除しました – Morishiri

1

JavaScriptが実際にネイティブクラスを持っていないことを考慮して取る必要があります。これは言って、道あなたは順序での「模倣」クラスをコンストラクタを作成し、そのようなものを作成する必要がthisを使用することができることができます。

function fnc (string) { 
    this.string = string; 
} 

fnc.prototype.getString = function() { 
    return this.string; 
} 

var x = new fnc('bar'); 
console.log(x.getString()); //bar 

これはコンストラクタのパターンと呼ばれています。

ここ
var fn = (function() { 
    var string = 'foo'; 
    return { 
    getString() { 
     return string; 
    } 
    } 
})(); 

console.log(fn.getString()); //foo 

は実施例である: 何をしようとしていることは何かそのように動作しますモジュールのパターンと呼ばれるものを使用している。またhttps://repl.it/FCn7

、良い読み取り:https://addyosmani.com/resources/essentialjsdesignpatterns/book/

編集 getStringsetStringをモジュールパターンで使用した例

var fn = (function() { 
    var string = 'foo'; 
    return { 
    getString() { 
     return string; 
    }, 
    setString(str){ 
     string = str; 
    } 
    } 
})(); 

fn.setString('xyz'); 
console.log(fn.getString()); // xyz 
関連する問題