JS 伪继承 prototype

众所周知JS中没有类的概念,但是要想实现类的功能可以同过function模拟。如:

第一种继承 (属性继承)


    //该函数相当于是一个构造器,也是一个伪类
    function Fn(){

        this.a = 4;
        this.b = 5;

        this.log = function(){
            console.log(this.a,this.b);
        }
    }

    function Fn1(){
        Fn.call(this);//调用父类的构造函数
    }

    Fn1.prototype = Fn.prototype;

    var fn = new Fn();
    var fn1 = new Fn1();

    //由此可见Fn1 是fn1的子类。
    fn1 instanceof Fn; // true
    fn  instanceof Fn1; // true

    fn.a = 5;

    //由此可见Fn1 继承了 Fn得所有属性和方法
    //而是是复制了一份Fn的属性和方法,并不是对象的引用。
    console.log(fn.a); // 5
    console.log(fn1.a); // 4
    this.log(); // 4 5

总结: 这种继承,是重新拷贝一份放入内存中,他们的值互相独立,修改一个不会改变另一个。

第二种继承 原型继承(prototype)


    function Fn(){}

    Fn.prototype.data = {
        name: 'zhangsan'
    }
    Fn.prototype.getName = function(){

        return this.data.name;
    }

    function Fn1(){}

    //原型链继承
    Fn1.prototype = Fn.prototype;

    var fn = new Fn();
    var fn1 = new Fn1();

    //所用Fn1 继承了 Fn
    fn1 instanceof Fn;//true
    console.log(fn1.getName()); // zhangsan
    console.log(fn.getName()); // zhangsan

    //修改了fn的name属性值
    fn.data.name = 'lisi';

    // 由此我们可看出 原型链继承 是 引用继承
    //不会重新拷贝一份变量。就像对象的引用一样。
    console.log(fn.getName()); // lisi
    console.log(fn1.getName()); // lisi

两种类的写法造成示例的区别


    //第一种
    function Fn(){

        this.a = 4;
        this.b = 5;

        this.log = function(){
            console.log(this.a,this.b);
        }
    }

    var fn1 = new Fn();
    var fn2 = new Fn();
    fn1.a = 1;

    //由此可以看出两个对象互不影响
    //说明每个对象里都存在一份a和b
    fn1.log(); // 1 5
    fn2.log(); // 4 5


    //第二种
    function Fn(){}
    fn.prototype.name = 'zhangsan';
    fn.prototype.data = {
        a: 4,
        b: 5
    }
    fn.prototype.log = function(){
        console.log(this.data.a,this.data.b);
    }

    var fn1 = new Fn();
    var fn2 = new Fn();
    fn1.a = 1;

    //由此可见就算是不同的示例他们他们所指向的值是同一个。
    fn1.log();//1 5
    fn2.log();//1 5

    fn2.name = 'lisi';

    //这里fn1.name并没有被修改
    console.log(fn1.name); //zhangan
    console.log(fn2.name); // lisi

总结

  1. 类中直接this. 出来的属性和方法都会直接复制一份给子类或者实例对象。个子类或实例对象之间互不影响。
  2. 使用prototype增加的属性和方法,对象类型的只有一份,值类型的这会被复制。

收获

由于函数都是通用的,所以比较上面两种方法,第二种明显比第一种性能要好的多,因为避免了没有必要的复制,肯定会比较节省内存。所以以后写类的时候,尽量使用第二种方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值