JavaScript性能最適化の改竄防止対象
13436 ワード
私たちは開発中に他人のコードを不用意に修正したり、重大な結果をもたらす可能性があります.そこでES 5は改竄防止の対象を定義しました.ただし、オブジェクトを改竄防止の対象として定義すると、取り消せなくなりますので、注意してください.
オブジェクトを拡張できません
デフォルトでは、すべてのオブジェクトが拡張されます.つまり、いつでもオブジェクトに属性と方法を追加することができます.たとえば:
ECMAScript 5を対象として定義された第二の保護レベルは、密封対象である.シールオブジェクトは拡張できません.既存のメンバーの「Configrable」特性はfalseに設定されます.これは、属性と方法を削除することができないことを意味し、***Object.defineProperty()**を使用してデータ属性をアクセス器の属性に変更することができないため、または反対です.属性値は変更可能です.オブジェクトを密封するには、Object.sealを使用します.
最も厳しい改ざん防止レベルは凍結対象です.凍結されたオブジェクトは拡張できないし、密封されているし、オブジェクトはデータ属性の[Writable]特性がfalseに設定されます.[セット]関数を定義すると、アクセス属性はまだ書き込み可能です.ES 5で定義されているObject.freeze()方法は、オブジェクトを凍結するために用いることができる.
あなたの堅持がいつか収穫されることを願います.
オブジェクトを拡張できません
デフォルトでは、すべてのオブジェクトが拡張されます.つまり、いつでもオブジェクトに属性と方法を追加することができます.たとえば:
var person = {
name: " "
}
person.age = 14;
console.log(person);//{name: " ", age: 14}
console.log(person.age);//14
Object.prevent Extensions()法を使えばこの挙動を変えることができます.属性や方法を追加できません.オブジェクトを拡張できませんが、元の属性に影響を与えず、元の属性を変更または削除できます. var person = {
name: " "
}
Object.preventExtensions(person); // person
person.age = 14;
console.log(person); //{name: " "}
console.log(person.age); //undefined
person.name = " ";
console.log(person.name);//
Object.isExtensioble()の方法を用いて、オブジェクトが拡張可能なオブジェクトであるかどうかを判定することができる. var person = {
name: " "
}
console.log(Object.isExtensible(person)); //ture
Object.preventExtensions(person);
console.log(Object.isExtensible(person)); //false
オブジェクトを密封するECMAScript 5を対象として定義された第二の保護レベルは、密封対象である.シールオブジェクトは拡張できません.既存のメンバーの「Configrable」特性はfalseに設定されます.これは、属性と方法を削除することができないことを意味し、***Object.defineProperty()**を使用してデータ属性をアクセス器の属性に変更することができないため、または反対です.属性値は変更可能です.オブジェクトを密封するには、Object.sealを使用します.
var person = {
name: " "
}
Object.seal(person);
person.age = 19;
console.log(person.age); //undefined
//
delete person.name;
console.log(person.name); //
// 。
オブジェクトが密封されているかどうかをObject.isSealed()法を使用して決定することができます.また、密封されたオブジェクトは拡張できないので、Object.isExtensioble()検出もfalseに戻ります. var person = {
name: " "
}
Object.seal(person);
console.log(Object.isSealed(person)); //true
console.log(Object.isExtensible(person)); //false
オブジェクトを凍結最も厳しい改ざん防止レベルは凍結対象です.凍結されたオブジェクトは拡張できないし、密封されているし、オブジェクトはデータ属性の[Writable]特性がfalseに設定されます.[セット]関数を定義すると、アクセス属性はまだ書き込み可能です.ES 5で定義されているObject.freeze()方法は、オブジェクトを凍結するために用いることができる.
var person = {
name: " "
};
Object.freeze(person);
person.age = 18;
console.log(person.age); //undefined
delete person.name;
console.log(person.name); //" "
person.name = " ";
console.log(person.name); //" "
もちろん,凍結対象を検出するためのObject.isFrozen()法もある.凍結対象はシールであり拡張不可能であるため、Object.isExtenseble()とObject.isSealed()の検出凍結対象はそれぞれfalseとtrueに戻ります. var person = {
name: " "
};
alert(Object.isExtensible(person)); //true
alert(Object.isSealed(person)); //false
alert(Object.isFrozen(person)); //false
Object.freeze(person);
alert(Object.isExtensible(person)); //false
alert(Object.isSealed(person)); //true
alert(Object.isFrozen(person)); //true
ちょっと注意したいのですが、改竄防止の対象に対して不法操作をする場合、非厳格モードでは無視されますが、厳格なモードではミスを投げかけることがあります.あなたの堅持がいつか収穫されることを願います.