javascript object oriented programming ,三

/*
   *非构造函数,那就是只要不是构造函数的
   * 两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。
   * json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点。
  */
   var chinese = {
                nation:"中国"
        }

        var Doctor = {
                career:'医生'
        }
        //
        function object(o){
                //创建一个空的构造函数F,F的prototype是o(父对象,或者叫要被继承的对象)对象的引用,
                //也就是说F.prototype指向需要继承的对象
                function F(){}
                F.prototype = o;
                //返回F构造函数的实例化对象,这样F的实例化对象就有个对父对象的引用了。
                return new F();
        }

        var Doctor = object(chinese);
        Doctor.career = '医生';       //然后,再加上子对象本身的属性: 这步不需要也能继承到!
        console.log(Doctor.nation)        // 中国    子对象已经继承了父对象的属性了。

          /*
                * 三、浅拷贝 (拷贝基本类型的数据)这是早期jQuery实现继承的方式。
                *     除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。
          */
                var chinese = {
                        nation:"中国",
                        birthPlaces :['北京','上海','香港']
                }
                var Doctor = {
                        career:'医生'
                }
                function extendCopy(p){
                        var c = {}                              //创建一个空对象,用于存储要拷贝的属性
                        for(var i in p){
                                c[i] = p[i];
                        }
                        c.uber = p;                             //子对象的一个属性对父对象的引用,备用属性~
                        return c;
                }
                var Doctor = extendCopy(chinese);
                //如果修改了Doctor.birthPlaces 的属性值,chinese.birthPlaces也会受到影响
                Doctor.birthPlaces.push('厦门');
                console.log(Doctor.nation);

                console.log(Doctor.birthPlaces);
                console.log(chinese.birthPlaces);
         /*
          * 四、深拷贝 目前,jQuery库使用的就是这种继承方法。
          *     所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。
         */
         var chinese = {
    nation:"中国",
    birthPlaces :['北京','上海','香港']
        }
        var Doctor = {
                career:'医生'
        }
        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);
        //现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:

        Doctor.birthPlaces.push('厦门');
        console.log(Doctor.nation);
        console.log(Doctor.birthPlaces); //["北京", "上海", "香港", "厦门"]
        //这时,父对象就不会受到影响了。
        console.log(chinese.birthPlaces); //["北京", "上海", "香港"]

非构造函数的继承

学习笔记,记录学习过程的地方。

原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html