开发过程中,每个开发者定义的对象可能不想要被别的开发者所重写或者新增对象属性,这时候可以将对象变为防篡改对象,当然防篡改对象也有分级别的
javaScript里面的对象默认都是可以拓展的,也就是说创建一个对象,可以给这个对象添加属性和方法
// 此代码在非严格模式下
var obj = {
name:'zyp',
age:'20'
}
obj.sayName = function(){
alert(this.name)
}
我们可以为新建的对象指定额外属性或者方法,这些都是被允许的。使用Object.preventExtensions()方法可以将对象设置为不可拓展对象,这样就不能再给对象添加属性和方法了
Object.preventExtensions(obj)
obj.job = 'teacher'
obj.job // undefined
调用了Object.preventExtensions()方法后,就不能为obj对象添加方法和属性了,在非严格模式下,给obj添加属性和方法是静默失败的,在严格模式下,给不可拓展对象添加属性和方法会报错。
值得注意的是虽然不能给对象添加属性和方法,但是原有对象已经存在的成员是不受影响的,我们仍然可以修改和删除已有的属性和方法。
使用Object.isExtensible()方法可以确定对象是否可以拓展
var obj = {
name:'zyp'
}
var foo = {
name:'myy'
}
Object.preventExtensions(obj)
Object.isExtensible(obj) // false 不可拓展
Object.isExtensible(foo) // true 可以拓展
密封对象是不可拓展的,同时密封对象所拥有的成员的 [[Configurable]]特性会被设置为false,但是属性值是可以修改的
Configurable是属性的特性性,表示能否通过delete删除属性从而重新定义属性,默认是为true。
属性的特性就是用来描述js属性的各种特征,具体可以上网查下资料,这里不细讲~
通过Object.seal()方法密封对象
var obj = {
name:'zyp'
}
obj.age = 20
obj.age // undefined
delete obj.name
obj.name // zyp
在非严格模式下,给密封的对象添加属性会静默失败,删除已有属性的操作也会被忽略。而在严格模式下,对密封对象添加和删除属性都会导致报错。
使用Object.isSealed()方法可以知道对象是否被密封了,由于密封的对象也是不可拓展的,所有用Object.isExtensible()检测密封的对象也是会返回false
var obj = {
name:'zyp'
}
var foo = {
name:'myy'
}
Object.seal(obj)
Object.isExtensible(obj) // false
Object.isExtensible(foo) // true
Object.isSealed(obj) // true
Object.isSealed(foo) // false
js最严格的防篡改的级别是冻结对象。冻结的对象是不可拓展、又是密封的,而且对象的数据属性[[Writable]]会被设置为false,意味者属性不能被修改。
使用Object.freeze()可以冻结对象
var obj = {
name:'zyp'
}
Obj.freeze(Obj)
obj.age = 20
obj.age // undefined
delete obj.name
obj.name // zyp
obj.name = 'myy'
obj.name // zyp
非严格模式下对冻结的对象在执行非法操作在非法操作(新增、删除、修改等)会静默失败,而在严格模式下会报错
使用Object.isFrozen()方法可以知道对象是否被冻结了,由于冻结的对象是不可拓展的又是密封的,所有用Object.isExtensible()和Object.isSealed()检测冻结对象是分别返回false和ture
var obj = {
name :'zyp'
}
Object.isExtensible(obj) // true 可拓展
Object.isSealed(obj) // false 不是密封对象
Object.isFrozen(obj) // false 不是冻结对象
Object.freeze(obj)
Object.isExtensible(obj) // false 不可拓展
Object.isSealed(obj) // true 密封的对象
Object.isFrozen(obj) // true 冻结的对象
防篡改对象是很有用的,当我们自己编写js库时候,最怕有人意外修改了库的核心对象,冻结对象或者密封对对象能防止这些问题的发生。
ECMA-262把对象定义为:”无需属性的集合,其属性可以包含基本值、对象或者函数。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名对值,其中值可以是数据或函数。
这篇文章讲解Js数组和对象的一些使用技巧,如何将不同的数组,对象合并/结合为1个的方法
在JavaScript中可以使用 . 或者 [ ] 来访问对象的属性,但是对象中方法只能通过 . 来获取;使用.运算符来存取对象的属性的值。或者使用[]作为一个关联数组来存取对象的属性。但是这两种方式有什么区别了?
对象使用obj.length时,它得到的值是undefined的,所以只能通过for...in循环获取对象的属性,我们发现并没有按属性的顺序显示,而且顺序在各个浏览器下显示也不同。 这是为什么呢?
JS声明对象时属性名加引号与不加引号的问题,一般情况下属性名加引号和不加引号是都可以的,效果是一样的。如果属性名是数字,则必须用“”包围,并且用 [] 方括号访问。
javascript的原生对象:也叫内部对象、本地对象、native object;内置对象:Global(全局对象)、Math ;宿主对象:有宿主提供的对象,在浏览器中window对象以及其下边所有的子对象(如bom、dom等等),在node中是globla及其子对象,也包含自定义的类对象。
判断对象中是否有某属性的常见方式总结,不同的场景要使用不同的方式。一点( . )或者方括号( [ ] )、二in 运算符、三hasOwnProperty()。三种方式各有优缺点,不同的场景使用不同的方式,有时还需要结合使用
error,指程序中的非正常运行状态,在其他编程语言中称为“异常”或“错误”。解释器会为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信息。
由于JavaScript的灵活性,我们可以轻易地重写(override)一些于其他人定义的对象(object)。换句话说,任何人都可以重写我们所定义的对象。这是一个非常强大的特性,许多开发者都有兴趣试试,来拓展或者修改某些对象的行为。
虽然现在已经是ES6的时代,但是,还是有必要了解下ES5是怎么写一个类的。本文详述JavaScript面向对象编程中的类写法,并分步骤讲述如何写出优雅的类。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!