js上級テクニック

6116 ワード

js上級テクニック
安全のタイプ検出
let data = [1,2,3,4]
console.log(data instanceof Array)
しかし、上記の方法はiframeで親ウィンドウ変数にアクセスしたときに失敗します.


    <span class="hljs-keyword">let</span> data = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>]
    console.log(data instanceof Array)

    window.global = {
        arr:[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">0</span>,<span class="hljs-number">43</span>]
    }
    console.log(<span class="hljs-string">"self"</span>,window.global.arr instanceof Array)



// iframe   


    console.log(<span class="hljs-string">"iframe"</span>,window.parent.global.arr instanceof Array)





///

        class draw{
            constructor(){
                this.point = []
            }
            handleMouseClick(event){
                this.point.push(event.latLng)
            }
            init(){
                $map.on('click',this.handleMouseClick)   ///   this    draw
            }
        }


///    

        class draw{
            constructor(){
                this.point = []
            }
            handleMouseClick(event){
                this.point.push(event.latLng)
            }
            init(){
                let _this = this;
                $map.on('click',event=>_this.handleMouseClick(event))   ///   this    draw
            }
        }

//          this                   this     

init(){
    $map.on('click',event=>this.handleMouseClick(event))   ///   this    draw
}
オブジェクトの改竄を防ぐ
作成したオブジェクトが誤って改竄されないように保護方法を書きます.
  • Object.sealは、属性の追加と削除を防止する
  • let person = {
        name:1
    }
    
    Object.seal(person)
    
    delete person  //false
    
    person.age=3    //     undefined
    //          
    
  • Object.freeze凍結対象
  • この方法は属性値を変えられないし、属性を増やすこともできません.
    b = {a:2}
    {a: 2}
    Object.freeze(b)
    {a: 2}
    b.t=2
    2
    b
    {a: 2}
    b.t 
    undefined
    b.a=99
    99
    b
    {a: 2}
    
    //        
    //   Object.isFrozen 、 Object.isSealed 、 Object.isExtensive          
    
  • defineProperty凍結単一属性
  • enumable/writalbeをfalseに設定すると、このプロパティは巡回や書き込み不可になります.
    m = {
        name:'qqq'
    }
    {name: "qqq"}
    Object.defineProperty(m,'grade',{enumerable:false,value:3})   ///     
    {name: "qqq", grade: 3}
    for(let key in m){console.log(key)}
    VM4830:1 name
    undefined
    
    
    
    
    y={m:12}
    {m: 12}
    Object.defineProperty(y,'grade',{writable:false},44)  ///    
    {m: 12, grade: undefined}
    y
    {m: 12, grade: undefined}
    y.grade=4
    4
    y
    {m: 12, grade: undefined}