js一百零一夜之第十夜-javascript 的非构造函数继承

来源:互联网 发布:网络数据抓取工具 编辑:程序博客网 时间:2024/06/08 13:15
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>非构造函数的继承</title>
<script>
//有两个对象
/* var Chines={
"type":"中国人"
}
var doctor={
"position":"医生"
}
////第一种对象继承法:实际上将父对象赋值给子对象prototype属性
function object(o){
var F=function(){}
F.prototype=o;
return new F();
}
var doctor=object(Chines);
doctor.position="医生";
alert(doctor.type);*/
//第二种 浅拷贝:只能拷父对象的属性,而如果父对象的属性是数组和方法时候子对象获得的只是一个内存地址,而不是真正的拷贝
//因此存在父对象被篡改的可能。
/*var Chinese = {
    nation:'中国'
   };
var Doctor ={
    career:'医生'
  }
Chinese.birthPlaces = ['北京','上海','香港'];
function extend(Child,Parent){
var c=Child;
var p=Parent;
for(var i in p){
c[i]=p[i];
}
return c;
}
var obj =extend(Doctor,Chinese);
alert(obj.birthPlaces);//北京,上海,香港
obj.birthPlaces.push("武汉");
alert(Chinese.birthPlaces);//北京,上海,香港,武汉*/
//这种拷贝是限用于只有单一属性的拷贝
//第三种深拷贝,所谓深拷贝就是真正意义上实现父类数组和对象的拷贝,他的实现并不难只是递归调用了浅拷贝而已
var Chinese = {
    nation:'中国'
   };
var Doctor ={
    career:'医生'
  }
Chinese.birthPlaces = ['北京','上海','香港'];
function deepCopy(p,c){
try{
var c=c || {};
var p=p;//被拷贝的对象
for(var i in p){
if(typeof p[i]==="object"){
c[i]=(p[i].constructor==Array) ? [] :{};
deepCopy(p[i],c[i]);
}else{
c[i]=p[i];
}
 }
 return c;
}catch(e){alert(e)}
}
var Doctor=deepCopy(Chinese);
alert(Doctor.birthPlaces);//北京,上海,香港
Doctor.birthPlaces.push("广州");
alert(Chinese.birthPlaces);//北京,上海,香港
alert(Doctor.birthPlaces);//北京,上海,香港,广州
//这样子对象的变化对父对象没有影响,so-easy
</script>
</head>

<body>
</body>
</html>


0 0
原创粉丝点击