函数p(){
VaR len = arguments.length;
对于(var i = 0;i < i;i + +){
document.write(参数{我} + );
}

}
函数(x,y){ Myclass
这个;
这个,y = y;
这个=函数(){
返回这个;
}
}
VaR M1 =新Myclass(1,2);
VaR M2 =新Myclass(3,4);
P(m1.show(),m2.show());



存在的问题

1。由于所有实例都由同一方法定义的实体进行复制,效率(内存效率和执行效率很低)可以通过原型解决。

2。属性值的访问控制(私有、公共)不能通过闭包来解决。

属性访问的操作对象不是变量,而是对对象的引用。

只读取数值的整数部分的处理。

数学{ < 0'celling:'floor}(本);

关联数组

关联数组必须通过JS中的对象实现。

基本操作通过键、元素设置、元素删除来实现。



var map = x:3,y:4 };
p(map);
删除映射
对于未存在的元素,未定义的访问是未定义的,因为它可以被设置为未定义的值,因此不能通过比较值与未定义值来判断值是否存在。它可以用以下方式枚举。
a 'undefined;
p(a);未定义的
P(typeof地图。x = =一个); / /真的



作为关联数组要注意的点



函数(x,y){ Myclass
这个;
这个,y = y;
}
Myclass。原型。Z = 5;
var obj =新Myclass(1,2);
对于(OBJ VAR键){
P(键+:+ obj {重点}); / /将枚举的原型继承的属性
}
1:2:5
删除对象X; / /真的
P(obj,x); / /未定义
P(obj。Z); / / 5
不能删除继承属性的原型。
删除obj。z; / /真的
P(obj。Z); / / 5
当使用作为关联数组的对象时,通常使用文字创建,即使创建对象数组中没有元素的视图使用空的视图,空属性仍然从原型中的对象类继承。
P('tostring'in obj); / /真的
var obj1 = { };
P('tostring'in obj1); / /真的
for枚举中的
P(obj1。长度); / /未定义
(VaR K在为obj1){
P(obj1 {K });
}
/ /没有元素列举的这是因为可枚举属性的原因
确定其性质或属性或通过继承hasownproperty原型
var map { };
P(map.hasownproperty('tostring ')); / /假
{ } = 1 'tostring地图;
P(map.hasownproperty('tostring ')); / /真的
删除地图{ 'tostring};
P(map.hasownproperty('tostring ')); / /假



Attribute attributes



对象的属性也是一些属性。

下表总结了ECMAscript第五版中定义的属性,属性值定义为属性的值

表1







属性的属性名



意义





可写



可以重写属性值。





枚举



可以枚举为





可配置



属性可以更改,属性可以删除。





得到



可指定属性值的吸气剂函数





集



可以指定属性值的设置函数






不可变对象

字符串对象的对象是典型的不可变对象,在生成后不能再更改。

灵活使用不可变对象可以提高程序的健壮性,例如,当方法被传递给方法参数时,有一种重写对象内容的方法。

在js中可以用以下方式实现不可变对象

1。隐藏属性(隐藏状态),不提供更改操作(关闭实现)

2。灵活使用ECMAscript第五版提供的功能

三.灵活地使用可写的、可配置的属性,以及设置和满足。

在ECMAscript第五版支持对象的不变性的功能表所示







方法名称



属性添加



属性删除



属性值的变化



确认方法





preventextensions



X



o



o



object.isextensible





密封



X



X



o



object.issealed





冻结



X



X



X



object.isfrozen






object.preventextensions例子



var obj = { x 2,y 3 };
object.preventextensions(obj);
无法添加属性
Z = 4的目标;
P(object.keys(obj)); / / X,Y
可以删除属性
删除obj。Y;
P(object.keys(obj)); / / X
可以改变财产的价值。
obj。x = 20;
P(obj,x); / / 20

/ / object.seal示例设置属性的配置错误
var obj = { x 2,y 3 };
Object.seal(obj);
无法添加不能删除
Z = 3的目标;
P(object.keys(obj)); / / X,Y
删除对象X; / /假
P(object.keys(obj)); / / X,Y
可以更改属性值
obj。x = 20;
P(obj,x); / / 20



/ / object.freeze示例设置属性的读写错误
var obj = { x 2,y 3 };
Object.freeze(obj);
无法添加 /不能删除,无法更改属性值
Z = 3的目标;
P(object.keys(obj)); / / X,Y
删除obj X;
P(object.keys(obj)); / / X,Y
可以更改属性值
obj。x = 20;
P(obj,x); / / 20



需要注意

1。上述三种方法一旦发生更改就无法恢复。

2。如果原型继承中继承的方法没有改变,则需要显示它。