对象除了包含属性之外,每个对象还拥有3个相关的对象特性(object attribute):
- 对象的原型(prototype):指向另外一个对象,本对象的属性继承自它的原型对象。
- 对象的类(class):是一个标识对象类型的字符串。
- 对象的扩展标记(extensible flag):指明了(在ECMAScript5)是否可以向该对象添加新属性。
引用对象
在创建对象之后,可以把对象的地址赋值给变量,实现变量对对象的引用。当把变量赋值给其他变量时,则实现多个变量引用同一个对象。
o={
x:2,
y:3,
z:true
}
o1=o;
alert(delete o);
alert(o1.y);
alert(o.y);



复制对象
赋值对象的设计你思路:利用for/in语句遍历对象成员,然后逐一复制给另一个对象。
function F(x,y){
this.x=x;
this.y=y;
this.add=function(){
return this.x+this.y;
}
}
F.prototype.mul=function(){
return this.x*this.y;
}
var f=new F(2,3);
var o={};
for(var i in f){
o[i]=f[i];
}
alert(o.x);
alert(o.y);
alert(o.add());
alert(o.mul());



对复制法进行封装,使其具有较大的灵活性。
Function.prototype.extend=function(o){ //为Function扩展复制的方法
for(var i in o){ //遍历参数对象
this.constructor.prototype[i]=o[i];
//把参数对象成员复制给当前对象的构造函数原型对象
}
}
复制操作实际上是通过反射机制复制对象的所有可枚举属性和方法来模拟继承。这种方法能够实现模拟多继承。
其缺点:
- 由于是反射机制,反复法不能继承非枚举的方法。对于系统核心对象的只读方法和属性也是无法继承的。
- 通过反射机制来复制对象成员的执行效率会非常差。当对象结构越庞大时,这种低效率越明显。
- 如果包含同名成员,这些成员可能会被动态复制所覆盖。
克隆对象
通过克隆对象可以避免复制对象操作的低效率。具体方法:
Function.prototype.clone=function(o){ //对象克隆方法
function Temp(){}; //新建空构造函数
Temp.prototype=o; //把参数对象赋值给该构造函数的原型对象
return new Temp(); //返回实例化后的对象
}
var o=Function.clone(new F(2,3));
alert(o.x);
alert(o.y);
alert(o.add());
alert(o.mul());
销毁对象
JavaScript提供了一套垃圾回收机制,能够自动回收无用存储单元。当对象没有被任何变量引用时,JavaScript会自动侦测,并运行垃圾回收程序把这些对象注销,以释放内存。
每当函数对象被执行完毕,垃圾回收程序就会自动被运行,释放函数所占用的资源,并释放局部变量。另外,如果对象处于一种不可预知的情况下,也会被回收处理。
var o={
x:1,
y:true
}
o=null; //定义对象引用变量为null,即废除对象
alert(o.x); //提示系统错误,找不到对象
本文深入探讨JavaScript对象的三个核心特性:原型、类和扩展标记,以及如何通过引用、复制和克隆操作管理对象。同时,文章讲解了JavaScript的垃圾回收机制,帮助读者理解对象生命周期。

被折叠的 条评论
为什么被折叠?



