JS進級編--JSアプリの巧みな使い方とObject.definePropertyの使用に拡張します.


Math.maxは、配列の中で最大の項目を得ることを実現します.
var array = [1,2,3,4,5];
var max = Math.max.apply(null, array);
console.log(max); // 5
呼び出し時に最初のパラメータがnullに与えられました.これはオブジェクトが呼び出されていないので、この方法で演算を助けて、戻った結果を得るだけでいいです.
Math.min実現は配列の中で一番小さい項目を得ることができます.
var array = [1,2,3,4,5];
var min= Math.min.apply(null, array);
console.log(min); // 1
奋菚荪は、元のオブジェクトにmaxとminの方法を追加すると、元のオブジェクト方法Object.defineProperty()を使用して、直接にオブジェクトに新しい属性を定義したり、オブジェクトの既存の属性を修正したりして、このオブジェクトに戻ります.
Object.defineProperty(Array.prototype, 'max', {  
    writable: false,  
    enumerable: false,  
    configurable: true,  
    value: function () {  
        return Math.max.apply(null, this);  
    }  
});  
  
Object.defineProperty(Array.prototype, 'min', {  
    writable: false,  
    enumerable: false,  
    configurable: true,  
    value: function () {  
        return Math.min.apply(null, this);  
    }  
});
直接に配列上で呼び出してもいいです.
var arr = [54,545,2165,545,56];  
console.log(arr.max()); //2165 
console.log(arr.min()); //54
上記はObject.definePropertyの方法について述べました.
Object.definePropertyの使用
オブジェクトは、複数の名前/値ペアからなる無秩序な集合です.オブジェクトの各属性は、任意の種類の値に対応します.オブジェクトを定義するには、構造関数または字面の量の形式が使えます.
var obj = new Object;  //obj = {}
obj.name = "  ";  //    
obj.say = function(){};  //    
上記の属性を追加する方法に加えて、Object.definePropertyを使用して新しい属性を定義したり、既存の属性を変更したりすることもできます.
Object.defineProperty()の説明
文法:Object.defineProperty(obj, prop, descriptor)パラメータの説明:
  • obj:必要です.ターゲット
  • prop:必要です.定義または変更が必要な属性の名前
  • descriptor:必要です.ターゲット属性が持つ特性
  • 戻り値:
  • は、関数の対象に入る.すなわち、最初のパラメータobj
  • 属性に対して、読み取り専用か書き込み不可かなどの特性を設定できます.for..inまたはObject.keys()によって巡回することができるかどうか.
    オブジェクトの属性に特性記述を追加し、現在は2つの形態が提供されています.データ記述とアクセサ記述です.
    データの説明
    オブジェクトの属性を変更または定義する場合、この属性にいくつかの特性を追加します.
    var obj = {
        test:"hello"
    }
    //             
    Object.defineProperty(obj,"test",{
        configurable:true | false,
        enumerable:true | false,
        value:      ,
        writable:true | false
    });
    //             
    Object.defineProperty(obj,"newKey",{
        configurable:true | false,
        enumerable:true | false,
        value:      ,
        writable:true | false
    });
    
    データ記述の属性は任意です.各属性を設定する役割を見てください.
    value
    属性に対応する値は、任意の種類の値をデフォルトでundefinedとすることができます.
    var obj = {}
    //     :   value  
    Object.defineProperty(obj,"newKey",{
    
    });
    console.log( obj.newKey );  //undefined
    ------------------------------
    //     :  value  
    Object.defineProperty(obj,"newKey",{
        value:"hello"
    });
    console.log( obj.newKey );  //hello
    
    璣菗萼落リテーブル属性の値は書き換えられますか?trueに設定して書き換えられます.falseに設定します.書き換えられません.デフォルトはfalseです
    var obj = {}
    //     :writable   false,    。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false
    });
    //  newKey  
    obj.newKey = "change value";
    console.log( obj.newKey );  //hello
    
    //     :writable   true,    
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:true
    });
    //  newKey  
    obj.newKey = "change value";
    console.log( obj.newKey );  //change value
    
    この属性は列挙されますか?trueに設定して列挙できます.falseに設定します.列挙できません.デフォルトはfalseです
    var obj = {}
    //     :enumerable   false,     。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false
    });
    
    //       
    for( var attr in obj ){
        console.log( attr );  
    }
    //     :enumerable   true,     。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:true
    });
    
    //       
    for( var attr in obj ){
        console.log( attr );  //newKey
    }
    
    (i)configrableは、ターゲット属性を削除することができますか?または属性の特性を再度修正することができますか?trueに設定して、特性を削除または再設定できます.falseに設定します.特性は削除できませんか?再設定できません.デフォルトはfalseです
    この属性は2つの役割を果たします.
  • ターゲット属性はdeleteを使用して
  • を削除できますか?
  • ターゲット属性は、再度特性
  • を設定することができるかどうか.
    //-----------------            ------------------------
    var obj = {}
    //     :configurable   false,     。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false,
        configurable:false
    });
    //    
    delete obj.newKey;
    console.log( obj.newKey ); //hello
    
    //     :configurable   true,     。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false,
        configurable:true
    });
    //    
    delete obj.newKey;
    console.log( obj.newKey ); //undefined
    
    //-----------------            ------------------------
    var obj = {}
    //     :configurable   false,        。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false,
        configurable:false
    });
    
    //      
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:true,
        enumerable:true,
        configurable:true
    });
    console.log( obj.newKey ); //  :Uncaught TypeError: Cannot redefine property: newKey
    
    //     :configurable   true,        。
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:false,
        enumerable:false,
        configurable:true
    });
    
    //      
    Object.defineProperty(obj,"newKey",{
        value:"hello",
        writable:true,
        enumerable:true,
        configurable:true
    });
    console.log( obj.newKey ); //hello
    新規に定義された属性設定特性以外に、既存の属性設定特性を与えることもできます.
    //            ,    、   、    。
    var obj = {
        test:"hello"
    }
    
    //   
    obj.test = 'change value';
    
    console.log( obj.test ); //'change value'
    
    Object.defineProperty(obj,"test",{
        writable:false
    })
    
    
    //     
    obj.test = 'change value again';
    
    console.log( obj.test ); //   :'change value'
    
    >ヒント:Object.definePropertyを使用してオブジェクトに属性を追加すると、属性の特性が設定されていない場合、configurableenumerablewritableの値はすべてデフォルトのfalseです.
    var obj = {};
    //       ,        configurable,enumerable,writable      false
    //     newkey       、    、        
    //
    Object.defineProperty(obj,'newKey',{
    
    });
    
    //   
    obj.newKey = 'hello';
    console.log(obj.newKey);  //undefined
    
    //  
    for( var attr in obj ){
        console.log(attr);
    }
    
    設定の特性まとめ:
  • value:属性を設定する値
  • writable:値は書き換えられますか?true false
  • enumerable:ターゲット属性は列挙されてもいいですか?true false
  • configrable:ターゲット属性が削除されるかどうか、または特性true false
  • を再度変更することができますか?
    アクセサの説明
    アクセサを使用して属性の特性を記述すると、以下の特性属性を設定できます.
    var obj = {};
    Object.defineProperty(obj,"newKey",{
        get:function (){} | undefined,
        set:function (value){} | undefined
        configurable: true | false
        enumerable: true | false
    });
    
    >注意:ゲッターまたはセッター方法を使用した場合は、writableとvalueの2つの属性は使用できません.
    getter/setter
    オブジェクトの属性の値を設定または取得すると、getter/setterメソッドが提供されます.
  • getterは、属性値を取得する方法
  • である.
  • setterは属性値を設定する方法である.
  • 特性にget/set属性を用いて対応する方法を定義した.
    var obj = {};
    var initValue = 'hello';
    Object.defineProperty(obj,"newKey",{
        get:function (){
            //            
            return initValue;    
        },
        set:function (value){
            //            ,         value  
            initValue = value;
        }
    });
    //   
    console.log( obj.newKey );  //hello
    
    //   
    obj.newKey = 'change value';
    
    console.log( obj.newKey ); //change value
    
    >getまたはsetはペアで出現しなければならず、その一つを書き込めばいいです.メソッドが設定されていない場合、getとsetのデフォルト値はundefinedです.
    Object.definePropertyを通じて一つのオブジェクトのある属性に複数の方法を追加する.
    var obj = {};
    Object.defineProperty(obj,'atrr',{
        get:function(){
            var self = this;
            var num = 0;
            return {
                add:function(value){
                    return num + value;
                },
                reduce:function(value){
                    return num - value;
                }
            }
        }
    });
    
    console.log(obj.atrr.add(5)); //5
    console.log(obj.atrr.add(8)); //8
    console.log(obj.atrr.reduce(8));  //-8
    説明:objオブジェクトのarrオブジェクトに2つの方法addとreduceを追加しました.
    互換性
    ie 8の下ではDOMオブジェクトのみを使用し、元のオブジェクトにObject.defineProperty()を使用するとエラーが発生するように試みる.
    参照
    Object.defineProperty()
    関連してリンクを読みます:《JS基礎編--JSの中の列挙可能な属性と列挙できない属性と拡張》