• 闲聊javascript继承和原型


    javascript继承已经是被说烂的话题了,我就随便聊一点~

    一、javascript的复制继承

    javascript的继承有复制继承和原型继承,基于复制继承用的不太多,而且无法通过instanceof的验证

    //拷贝继承,prototype.js的extend=>
    function extend(destination,source){
        for(var property in source)
        destination[property]=source[properyt];
        return destination;
    }

    二、javascript原型继承

    js原型继承是基于原型链查找的,js每个函数都有prototype属性和__proto__属性,每个实例的__proto__属性都指向函数的prototype(es6里面实例的__proto__都指向这个函数),下面这个例子证明了这个观点。

    function A(){
        console.log(this.__proto__.aa);//1 
        this.aa=2
    }
    A.prototype={
        aa:1
    }
    var a=new A;
    console.log(a.aa);//2
    a.__proto__={
        aa:3
    }
    delete a.aa;//删除特权属性
    console.log(a.aa);//3

     实例在查找方法的时候按原型链查找,先找自身的属性,没有就到构造函数的prototype里找,没有再到构造函数的构造函数的prototype里找,只到Function的prototype。那我们让a的prototype等于A的实例,不就完成了继承了么。

    function A(){}
    A.prototype={
        aa:1
    }
    function bridge(){};
    bridge.prototype=A.prototype;
    function B(){}
    B.prototype=new bridge();
    B.prototype.constructor=B;

    这里继承是用了一个bridge函数做了桥,因为当A有很多内容的时候,实例化A消耗比较多,而且并没有什么用,就用一个空函数做桥接一下。这里最后再改一下实例的构造函数指向自己,这就完成了继承。

    var b=new B;
    B.prototype.cc=function(){
        alert(3)
    }
    console.log(b.__proto__==B.prototype);//true
    console.log(b.__proto__.__proto__===A.prototype);//true

    这里b的__proto__是指向构造函数的prototype的。

    三、基于object的原型继承:

     const extend  =  (to, from) => {
        // TODO: use `Reflect.ownKeys()` when targeting Node.js 6
            for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) {
                Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));
            }
    
            return to;
        };
  • 相关阅读:
    Zookeeper之 为什么最好是奇数台机器?
    Kafka 之 如何高吞吐和低延迟
    hbase 之 rowkey的设计
    Zookeeper之 两种选举制度|为什么需要过半投票机制?
    Mysql 之 union和union all
    Mysql之 distinct & null | distinct 调优
    Linux 之 系统资源命令
    Linux 之 vi 之 快速定位到n line
    Zeppelin问题 之 Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
    springboot项目中进行XSS过滤
  • 原文地址:https://www.cnblogs.com/dh-dh/p/5104073.html
Copyright © 2020-2023  润新知