bob体育官方平台
【bob体育官方平台】Javascript面向对象编程(三):非构造函数的继承

意气风发、数组的浓淡拷贝

以此连串的第风度翩翩有个别介绍了"封装",其次片段介绍了接纳构造函数完成"袭承"。

在运用JavaScript对数组举行操作的时候,大家日常供给将数组进行备份,事实注脚若是只是简短的将它授予别的变量,那么我们只要校正内部的其他多少个,然后此外的也会跟着变动,那就招致了难题的产生。

前些天是最终二个片段,介绍不接纳布局函数达成"世袭"。

那是怎么呢?

风华正茂、什么是"非构造函数"的存在延续?

因为即使只是简短的赋值,它只是举行了地点的援引,所以改换贰个另多少个也会随着变。

比如,今后有三个指标,叫做"中夏族民共和国人"。

var arr = ["One","Two","Three"];var arrto = arr;arrto[1] = "test";document.writeln("数组的原始值:" + arr + "
");//Export:数组的原始值:One,test,Threedocument.writeln("数组的新值:" + arrto + "
");//Export:数组的新值:One,test,Three

var Chinese = {

像上面那样就归属浅拷贝,那我们什么样技艺不改动原有的吗?

nation:'中国'

方法一:js的slice函数

};

var arr = ["One","Two","Three"];var arrtoo = arr.slice;arrtoo[1] = "set Map";document.writeln("数组的原始值:" + arr + "
");//Export:数组的原始值:One,Two,Threedocument.writeln("数组的新值:" + arrtoo + "
");//Export:数组的新值:One,set Map,Three

还应该有多少个对象,叫做"医师"。

方法二:js的concat方法

var Doctor ={

concat(卡塔尔(قطر‎ 方法用于连接四个或七个数组。

career:'医生'

该办法不会改动现存的数组,而单单会回去被连接数组的叁个别本。

}

var arr = ["One","Two","Three"];var arrtooo = arr.concat();arrtooo[1] = "set Map To";document.writeln("数组的原始值:" + arr + "
");//Export:数组的原始值:One,Two,Threedocument.writeln("数组的新值:" + arrtooo + "
");//Export:数组的新值:One,set Map To,Three

借问怎么着本领让"医务人士"去继续"中黄炎子孙民共和国人",也便是说,笔者如何技能生成三个"中夏族民共和国白衣战士"的目的?

二、对象的浓淡拷贝

那边要小心,这五个对象都以数见不鲜对象,不是布局函数,无法采用布局函数方法达成"世袭"。

var a={name:'yy',age:26};var b=new Object();b.name=a.name;b.age=a.age;a.name='xx';console.log;//Object { name="yy", age=26}console.log;//Object { name="xx", age=26}

var deepCopy= function { var result={}; for  { result[key] = typeof source[key]==='object'? deepCoyp: source[key]; } return result; }

二、object()方法

object()方法:json格式的发明人DougRussCrockford,建议了八个object(卡塔尔(英语:State of Qatar)函数,能够完毕那一点。

json格式的发明人DouglasCrockford,建议了一个object(卡塔尔国函数,能够完毕那一点。

function object {} F.prototype = o; return new F函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,从而使得子对象与父对象连在一起。

function object(o) {

接纳的时候,第一步先在父对象的底蕴上,生成子对象:

function F() {}

var Doctor = object;//然后,再加上子对象本身的属性:Doctor.career = '医生';//这时,子对象已经继承了父对象的属性了。alert; //中国

F.prototype = o;

上边大家看看阮意气风发峰的秘籍

return new F();

举例说,现在有多个对象,叫做"中华夏儿女民共和国人"。

}

 var Chinese = { nation:'中国' };

以此object(卡塔尔(英语:State of Qatar)函数,其实只做一件事,正是把子对象的prototype属性,指向父对象,进而使得子对象与父对象连在一齐。

再有二个指标,叫做"医务卫生职员"。

利用的时候,第一步先在父对象的底蕴上,生成子对象:

 var Doctor ={ career:'医生' }

var Doctor = object(Chinese);

借问怎么样技艺让"医师"去继续"中夏族民共和国人",也正是说,作者如何才具生成叁个"中华夏儿女民共和国医务卫生职员"的对象?

下一场,再加上子对象自笔者的品质:

三、浅拷贝

Doctor.career = '医生';

除去利用"prototype链"以外,还可能有另少年老成种思路:把父对象的属性,全部正片给子对象,也能兑现持续。

这时候,子对象已经三番四回了父对象的属性了。

下边那几个函数,正是在做拷贝:

alert(Doctor.nation); //中国

 function extendCopy { var c = {}; for  { c[i] = p[i]; } c.uber = p; return c; }

 var Doctor = extendCopy; Doctor.career = '医生'; alert; // 中国

三、浅拷贝

可是,那样的正片有二个难题。那正是,假若父对象的习性等于数组或另二个对象,那么实际上,子对象得到的只是二个内部存款和储蓄器地址,并不是真的拷贝,由此存在父对象被点窜的恐怕。

除去行使"prototype链"以外,还也是有另生龙活虎种思路:把父对象的性质,全体拷贝给子对象,也能促成持续。

请看,未来给Chinese增加三个"出生地"属性,它的值是多个数组。

下面这一个函数,正是在做拷贝:

Chinese.birthPlaces = ['北京','上海','香港'];

function extendCopy(p) {

通过extendCopy()函数,Doctor继承了Chinese。

var c = {};

var Doctor = extendCopy;

for (var i in p) {

接下来,大家为Doctor的"出生地"增添二个都会:

c[i] = p[i];

Doctor.birthPlaces.push;

}

发出了什么事?Chinese的"出生地"也被改掉了!

c.uber = p;

alert; //北京, 上海, 香港, 厦门alert; //北京, 上海, 香港, 厦门

return c;

之所以,extendCopy(卡塔尔只是拷Becky本项指标数目,大家把这种拷贝叫做"浅拷贝"。那是开始时代jQuery达成两次三番的方式。

}

返回顶部