面向对象比较重要的一环即为“对象的继承问题”,由于网络上类似的教程有很多,我直接举例 ,让您快速消化知识点。
我们定义了以下一串代码:一所中国的学校,一个喜欢读书的教师
1 2 3 4 5 6 var shcool = { nation : "china" } var teacher = { loving : "reading" }
但是我们希望建立两者的联系,实现: 一个喜欢读书的老师 在一所中国的学校里面
1 2 3 4 5 6 7 8 9 10 11 12 function object(test) { function F() {} F.prototype = test; return new F(); } var school={ nation:"china" } var teacher = object(school); teacher.loving="reading" alert(teacher.loving)//"reading" alert(teacher.nation)//"china"
执行结果 如我注释写的那样,完美继承父级的的属性。
这就是json格式的发明人Douglas Crockford提出的一个object()函数。 object() 函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,从而使得子对象与父对象连在一起。
除了使用”prototype链”以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。 下面就是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function clone(obj) { function F() {} F.prototype=obj; return new F() } var parent={ nation:"china", birth:function () { return ["北京","上海","广州"] } } var Jay = clone(parent) Jay.job="doctor" Jay.birth=parent.birth() Jay.birth.push("台湾") alert(Jay.job)//doctor alert(Jay.nation)//china alert(Jay.birth.length)//4 alert(parent.birth().length)//3
分析: 此处的clone()其实也是一种新的函数,只不过和上面的object()是同一过程。
这里我们实现了 全部复制(parent)父对象的所有(nation)属性以及(birth)方法
并且实现了一个效果:对 子对象的方法进行修改,并不会影响父对象的方法。
拷贝数据类型,这就是早期jQuery实现继承的方法。俗称浅拷贝 与之相匹配的还有深拷贝 所谓”深拷贝”,就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,不过本人并没有理解,不敢擅自分析,恐误人子弟,此处贴上demo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function deepCopy(p, c) { var c = c || {}; 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; } //调用方法: var Doctor = deepCopy(Chinese); //现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性: Chinese.birthPlaces = ['北京','上海','香港']; Doctor.birthPlaces.push('厦门'); alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门 alert(Chinese.birthPlaces); //北京, 上海, 香港
这就是目前jQuery库使用的继承方法 很抱歉,本人没能完成学习的深入,就写了此篇博文,希望小伙伴在留言区留下您的想法,和我一起分享学习的经历或是经验好么?
Yours Sincerely SunPing