面向对象的继承问题

Author Avatar
AppleSun 8月 10, 2016

面向对象比较重要的一环即为“对象的继承问题”,由于网络上类似的教程有很多,我直接举例 ,让您快速消化知识点。

我们定义了以下一串代码:一所中国的学校,一个喜欢读书的教师
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