一、三个对象特性
- 对象的原型(prototype):指向另外一个对象,本对象的属性继承自它的原型对象
- 对象的类(class):是一个标识对象类型的字符串
- 对象的扩展标记(extensible flag):指明了是否可以向该对象添加新属性
二、引用对象
- 通过把对象的地址赋值给变量,实现变量对对象的引用。
- 当把变量赋值给其他变量,则实现多个变量引用同一个对象。
- 删除变量,只是删除变量对对象的引用,对象仍然存在
1.示例
o={
x:1,
y:true
}
ol=o;
alert(delete o); //删除变量,返回值为true,说明删除成功
alert(ol.x);//读取对象内数据,显示为1,说明对象仍然存在
alert(o.x);//使用o读取对象内的数据,提示没有定义对象
三、复制对象
- 设计思路:利用for/in语句遍历对象成员,然后逐一复制给另一个对象
1.复制方法封装使用
function F(x,y){
this.x=x;
this.y=y;
this.add=function(){
return this.x+this.y;
}
}//构造函数
Function.prototype.extend=function(o){
for(var i in o){
this.constructor.prototype[i]=o[i];//this关键字指代当前示例对象,即本示例中的变量o;constructor属性指向它的构造器;prototype属性指向构造函数的原型对象。
}
}//该封装函数通过为Function类型对象拓展一个方法,该方法能够把指定的参数对象完全复制给当前对象(变量o)的构造函数的原型对象。
var o = function(){};//创建空的构造函数
o.extend(new F(2,3));//复制对象,该extend方法只能为构造函数结构复制对象
2.该复制方法的缺点
复制操作实际上是通过反射机制复制对象的所有可枚举属性和方法来模拟继承
- 由于是反射机制,复制法不饿能继承非枚举类型的方法。对于系统核心对象的只读方法和属性也是无法继承的。
- 通过反射机制来复制对象成员的执行效率会非常差。当对象结构越庞大时,这种低效越明显
- 如果包含同名成员,这些成员可能会被动态复制所覆盖。
四、克隆对象
1.代码
Function.prototype.clone=function(o){ //对象克隆方法
function Temp(){}; //新建构造函数
Temp.prototype=o; //把参数对象赋值给构造函数的原型对象
return new Temp();//返回实例化后的对象
}
var o=Function.clone(new F(2,3));//调用Function对象的克隆方法
2.克隆对象的优点
- 比起复制对象的方法,更高效
五、销毁对象
- 当对象没有被任何变量引用时,JavaScript会自动侦测,并运行垃圾回收程序把这些对象注销,一释放内存。
- 当把对象的所有引用变量设置为null时,可以强制对象处于废除状态,并被回收。
var o={};
o=null;
alert(o.x);//提示系统错误,找不到对象