JS面向对象---非构造函数之间的继承(阮一峰网络日志学习笔记)

通过对阮一峰老师文章的学习,已经自己手写了前面的两篇文章(都是看过软老师的,然后自己手写的)。今天要总结一下非构造函数之间的继承。

普通对象之间的继承。

var A = {gender: "男"};

var B = {name: "小明"};

问题是如何让B继承A的那么属性?(这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。

解决方法:

一、object()方法

    json格式的发明人Douglas Crockford(道格拉斯·克罗克福德),提出了一个object()函数,可以做到这一点。

    function object(o) {

        var F =  function(){};

        F.prototype = o;

        return new F();

    }

    var B = object(A);

    console.log(B.gender === "男"); // true

    通过创建一个空对象作为中介构造函数,并将该构造函数的原型指向目标对象,然后返回一个该构造函数的实例。

    使用:

那么使用的时候,新对象便会自动继承目标对象的属性了。

二、拷贝

    通过拷贝目标对象的各个属性,直接放在新对象上面,那么新对象就可以继承目标对象的属性了。

    2.1浅拷贝   只适合拷贝基本类型的属性的对象

    function lightCopy(p) {

        var c = {};

        for (var i in p) {

            c[i] = p[i];

        }

        return c

    }

    使用:

    var B = lightCopy(A);

    B.name = "小明";

    console.log(B.gender === "男"); // true

    2.2 深拷贝

    function deepCopy(p, c) {

        var c = c || {};

        for (var i in p) {   

            if (typeof p[i] == "object") {

                c[i] = (Object.prototype.toString.call(p[i]) == "[object Array]") ? [] : {};

                deepCopy(p[i], c[i]);

            } else {

                c[i] = p[i];

            }

        }

        return c

    }

    使用:

    var B = deepCopy(A);

    console.log(B.gender === "男"); // true

    看了阮老师文章下面别人的评论,有些地方不太明白,不了解具体的现实场景是怎样的,放在这里记录一下:(如果有人看到,能举个具体的例子就谢谢啦^^)

    JS面向对象---非构造函数之间的继承(阮一峰网络日志学习笔记)