zoukankan      html  css  js  c++  java
  • 关于原型链

    1、所有的函数都是Function的实例对象
    Function是函数,也是Function的实例对象
    函数声明方式定义的函数都是实例对象
    function foo(){
     
        }
        foo.call();
        var obj={
            info:123,
            showInfo:function(){
                console.log(this.info);
            }
        };
        obj.showInfo();
    console.log(foo.__proto__===Function.prototype);
        console.log(Function.prototype===Function.__proto__);
    2、原型对象prototype的本质是一个对象不是函数
    3、Math是Object的对象,并且Math是一个对象不是函数
    4、这些方法的__proto__最终都指向了Object.prototype;
    Object.prototype.abc=123;
        function foo(){}
        console.log(foo.abc);
        console.log(Array.abc);
        console.log(Object.abc);
        console.log(Math.abc);
    5、有两种方法来往原型中添加方法
    第一种
    function Student(name,age){
            this.name=name;
            this.age=age;
     
        }
        Student.prototype.showAge=function(){
            console.log(this.age);
        }
        Student.prototype.showName=function(){
            console.log(this.name);
        }
        console.dir(Student.prototype);
    第二种
    function Student(name,age){
            this.name=name;
            this.age=age;
     
        }
    Student.prototype={
            showAge:function(){
                console.log(this.age);
            },
            showName:function(){
                console.log(this.name);
            }
     
        }
        console.dir(Student.prototype);
    但是这两种方法有不同的地方
    如果你输出上面的代码你就会方法第一种方法比第二种多了一个constructor属性。没有这个属性我们就不容易发现这个原型对象是属于谁的,所以我们在这个对象中手动添加了一个constructor属性。
    Student.prototype={
            constructor:Student,
            showAge:function(){
                console.log(this.age);
            },
            showName:function(){
                console.log(this.name);
            }
     
        }
    6、执行下面这个代码,你会发现第一添加的原型已经被覆盖掉了。
    function Student(name,age){
            this.name=name;
            this.age=age;
     
        }
    Student.prototype.showInfo=function(){
            console.log('hello');
        }
        Student.prototype={
            constructor:Student,
            showAge:function(){
                console.log(this.age);
            },
            showName:function(){
                console.log(this.name);
            }
     
        }
        console.dir(Student.prototype);
    为了解决这个问题我们要把这个添加的原型放在用对象添加原型方法的代码的后面
      Student.prototype={
            constructor:Student,
            showAge:function(){
                console.log(this.age);
            },
            showName:function(){
                console.log(this.name);
            }
     
        }
        Student.prototype.showInfo=function(){
            console.log('hello');
        }
        console.dir(Student.prototype);
    此时打印出来的是三个方法。
    7、原型链的组成:实例对象+原型对象形成的链式结构
    节点之间是通过__proto__属性连接的。
     
    8、执行如下代码
    function Foo1(){
            this.info1=123;
        }
        Foo2.prototype=new Foo1();
        function Foo2(){
            this.info2=456;
        }
        Foo3.prototype=new Foo2();
        function Foo3(){
            this.info3=789;
        }
        var f3=new Foo3();
        console.dir(f3);
     
     
        此时的原型链指向:
        f3->new Foo2()->new foo1()->Foo1.prototype->Object.prototype->null
  • 相关阅读:
    centos下修改ip
    在sql2008的实例 中 编写存储过程 读取 版本为sql2005 的实例 中的某个数据库里的数据
    解决javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure报错
    Micronaut事务管理
    [make] 第二章 makefile 总述
    [make] 第一章 make 介绍
    [other] AutoHotKey.ahk
    2021年11月国产数据库大事记墨天轮
    风云再起之国产数据库风云榜2021年12月
    2021年12月墨天轮国产数据库排行榜: openGauss节节攀升拿下榜眼,GaussDB与TDSQL你争我夺各进一位
  • 原文地址:https://www.cnblogs.com/hughman/p/6822134.html
Copyright © 2011-2022 走看看