18日目JavaScript


カプセル化

     <script>
        function Calculate(w,h) {
            var width = w;
            var height = h;

            this.getWidth = function() { 
                return width;
            };

            this.getHeigth = function() {
                return height;
            };

            this.setWidth = function(w) {
                if(w < 0) {
                    throw '길이는 음수일 수 없습니다.';
                } else {
                    width = w;
                }
            };

            this.setHeigth = function(h) {
                if(h < 0) {
                    throw '높이는 음수일 수 없습니다.';
                } else {
                    height = h;
                }
            };
        }

        Calculate.prototype.getArea = function() {
            return this.getWidth() * this.getHeigth();
        };

        var calculate = new Calculate(5,7);
        
        // 오류메세지 출력
        // calculate.setWidth(-3);
        
        // output = 35
        alert('면적 = ' + calculate.getArea());
    </script>
カプセル化とは?
Privateプロパティとは、オブジェクトの外部にアクセスできない外部に非表示にするプロパティまたはメソッドです.
これにより、オブジェクト内部でしか使用できない値が露出したことによるエラーを低減することができる.
たとえば、多くの人と協力すれば、誰もが値にアクセスして変更できるため、これらの値を防止することで情報を保護できます.
上記の例では、関数の戻り値でオブジェクトを返します.このオブジェクトはメソッドgetWidthsetWidthです.等からなり,これらの方法は外部関数として計算されたパラメータ値として伝達される値を用いる.
例えば私たちはvar calculate = new Calculate(5,7); calculate.setWidth(-3);コードを記述すると、計算関数はthrow errorを出力します.幅が負の値であるためです.
このことから,getのwidthとsetwidthは互いに値を共有していることが分かる.
デフォルトでは、JavaScriptではプライベート属性はサポートされておらず、モジュールのこれらの特性を使用してプライベート属性を使用できます.
エンクロージャが必要
var array = [];
var number = 5;

for(var i = 0; i<number; i++) {
	array[i] = function() {
    	return i;
    }
}

for(var e in array) {
	console.log(array[e]());
}

output
5 5 5 5 5
arrayの配列は0 1 2 3 4で充填されるべきであると考えたが,return = iを返したため,i値は最終的にiの最終値5に変換された.
この問題を解決するために、エンクロージャを使用する必要があります.
Closerについては今度もっと知りましょう.
さらに勉強する内容
    <script>
        var originalArray = [1,2,3,4,5];
        var newArray = [];

        //깊은복사 = clone()
        for(var i in originalArray) {
            newArray[i] = originalArray[i];
        }
        
        originalArray[0] = 273;

        alert(originalArray);
        alert(newArray);
    </script>
for反復文では,newArrayに元のArrayの値を加えた.
そして、元のArray[0]の値を変更すると、newArrayの値も変わりますか?値段は変わらない.
理由は簡単だ.originalArraynewArrayの配列が異なるアドレスに格納されていると理解すれば容易である.
開けて言えば.originalArrayはA棟マンション、newArrayはB棟マンションに住んでいるので、originalArraynewArrayに再配分しないと、異なる配列になります.