• JavaScript的中对象创建和继承原理


    对象创建:

    当一个函数对象被创建时候,Function构造器产生的函数对象会运行类似这样的代码:
    this.prototype={constructor:this};
    假设函数F
    F用new方式构造对象时,对象的constructor被设置成这个F.prototype.constructor
    如果函数在创建对象前修改了函数的prototype,会影响创建出来对象的construtor属性
    如:

    function F(){};
    F.prototype={constructor:'1111'};
    var o=new F();//o.constructor===‘1111’ true

    继承原理:

    JavaScript中的继承是使用原型链的机制,每个函数的实例都共享构造函数prototype属性中定义的数据,要使一个类继承另一个,需要把父函数实例赋值到子函数的prototype属性。并且在每次new实例对象时,对象的私有属性__proto__会被自动连接到构造函数的prototype。

    instanceof就是查找实例对象的私有prototype属性链来确定是否是指定对象的实例

    具体实例:

    //instanceof实现
    function Myinstanceof(obj,type)
    {
       var proto=obj.__proto__;
       while(proto)
       {
           if(proto ===type.prototype)break;
           proto=proto.__proto__;
       }
       return proto!=null;
    }
    
    
    function View(){}
    function TreeView(){}
    TreeView.prototype=new View();//TreeView.prototype.__proto__=TreeView.prototype 自动完成
    TreeView.prototype.constructor=TreeView;//修正constructor
    var view=new TreeView();//view.__proto__=TreeView.prototype 自动完成
    alert(view instanceof View); //true 查找到view.__proto__.__proto__时找到
    alert(view instanceof TreeView); //true 查找到view.__proto__时找到
    alert(Myinstanceof(view,View));  //true
    alert(Myinstanceof(view,TreeView)); //true

    上面自定义的Myinstanceof就是自己实现的一个instanceof功能的函数,由于IE内核实例存储prototype不是__proto__,所以Myinstanceof会无法通过,其他浏览器上应该都没有问题

  • 相关阅读:
    常用DOS命令
    Intellij IDEA debug断点调试技巧与总结详解篇
    IDEA中常用函数的快捷键及自定义方法模板
    System.out.println()的真实含义
    盘点一下Github上开源的编程面试/学习相关的仓库
    IntelliJ IDEA
    JAVA基础——接口(全网最详细教程)
    Css基础
    CSS属性(根据继承性分为两类)
    HTML5新增标签(新增27个标签,废弃16个标签)
  • 原文地址:https://www.cnblogs.com/FlyCat/p/2936071.html
Copyright © 2020-2023  润新知