js上級テクニック
6116 ワード
js上級テクニック
安全のタイプ検出
作成したオブジェクトが誤って改竄されないように保護方法を書きます. Object.sealは、属性の追加と削除を防止する Object.freeze凍結対象 この方法は属性値を変えられないし、属性を増やすこともできません. defineProperty凍結単一属性 enumable/writalbeをfalseに設定すると、このプロパティは巡回や書き込み不可になります.
安全のタイプ検出
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
}
オブジェクトの改竄を防ぐ作成したオブジェクトが誤って改竄されないように保護方法を書きます.
let person = {
name:1
}
Object.seal(person)
delete person //false
person.age=3 // undefined
//
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
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}