美文网首页
第二十二章 原型

第二十二章 原型

作者: 扶光_ | 来源:发表于2021-06-07 09:15 被阅读0次

    一,原型

    每一个函数都有一个属性叫做prototype,这个值是一个对象,默认只有一个叫做constructor的属性,指向这个函数对象

    原型就是一个对象,其他的对象可以通过它实现一个属性的继承

    • 关键字 prototype
      写法:

                   Person.prototype.name = "侯旭";
      

    /通过原型来创造的属性 所有实例化的东西都是共享的

    首先我们创造一个构造函数,然后去实例化两个对象,将构造函数添加原型属性和方法,最后去实现原型属性和方法

     function Person(name){
            this.name = name
    
        }
        //原型(可以共用这一个方法)
        Person.prototype.fn = function(){
            // console.log("啊啊啊");
            return this.name;
            
        }
    //创建的原型的属性
        Person.prototype.age = "18";
        var person1 = new Person("熊大")
        var person2 = new Person("光头强")
        //正常的去输出两个名字
        console.log(person1.name);
        console.log(person2.name);
        //用共用的原型方法和属性
        console.log(person1.fn());
        console.log(person2.fn());
        console.log(person1.age);
        console.log(person2.age);
    
    
    原型
    • 关键字 __proto__

    每一个对象都会有的一个属性,proto,这个属性会指向该对象的原型(不是函数)

    因为创建对象的proto属性和指向该对象的原型 所以他们应该是相等的

    function Person(){
    
                }
                var person1 = new Person();
                console.log(person1.__proto__ ===   Person.prototype);
    
    __proto__
    • 关键字 constructor

    constructor 每一个原型(prototype)都有一个constructor的属性,指向该关联的构造函数

    因为prototype原型指向构造函数 所以他们应该也是对等的

     function Person(){
    
           }
           console.log(Person === Person.prototype.constructor);
    

    • 实例化和原型的关系

    当我们读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还找不到,就去原型的原型,直到找到为止

    举例:

    function Person(){
    
            }
            //创建的原型属性
            Person.prototype.name = "侯旭";
            //实例化构造函数
            var person1 = new Person()
            console.log(person1.name);//会输出侯旭 因为找不到实例的属性 
    
    侯旭
    上面的例子就验证了当我们读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,

    然后我们在举一个例子 给实例对象添加属性 然后通过对象.proto方法直接去找原型

    
            function Person(){
    
            }
            //原型属性
            Person.prototype.name = "侯旭";
            //实例化构造函数
            var person1 = new Person()
            console.log(person1.name);//会输出侯旭 找不到实例的属性 
    
            person1.name = "光头强";
            //通过__proto__跳过实例 直接去找原型侯旭
            console.log(person1.__proto__.name);//侯旭
    
    侯旭
    可以发现没有输出光头强,通过_proto-直接去找的原型属性
    • 扩展
     //原型也是一个对象 可以直接创建一个原型
            var obj = new Object();
            obj.name = "赵卤蛋"
            console.log(obj.name);
    

    原型链

    每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针constructor,而实例都包含一个指向原型对象的内部指针proto 加入我们让原型对象等于另一个的类型的实例,此时的原型对象将包含一个指向定一个原型的指针

    原型链说白了 就是指向关系 下面这张图片就是原型链


    原型链

    相关文章

      网友评论

          本文标题:第二十二章 原型

          本文链接:https://www.haomeiwen.com/subject/annkeltx.html