zoukankan      html  css  js  c++  java
  • new与构造函数

    function Cat(name,age){
        this.name = name
        this.age= age
    }
    //机制1:每一个函数对象都有一个prototype对象
    console.log(Cat.prototype)          //node输出:     {}
    Cat.prototype.get_name = function(){
        return this.name
    }
    
    //机制2:new关键字+构造函数 
        //step1:创建了一个新的对象{},该对象默认拥有__propto__对象
        //step2:构造函数的this指向新的对象{}  this--->{}
        //step3:构造函数的prototype对象复制给新的对象{}的__propto__
        //step4:返回新的对象
        //这个新的对象成为该构造函数的实例
    let cat1 = new Cat('baizhu',1)
    console.log(cat1)
    const cat2 = new Cat('heizhu',2)
    console.log(cat2)
    console.log(cat2.__proto__)
    
    //机制3:搜索机制(实例的属性方法搜索优先级)
         //在调用实例的属性方法时,优先搜索实例自己的属性和方法,如果没有再去__proto__里找
        let cat3 = new Cat('dawang',3)
        cat3.name = 4
        cat3.get_name = function(){
            return '我自己的方法:'+this.name
        }
        console.log(cat3.name)          //node输出:4
        console.log(cat3.get_name())    //node输出:我自己的方法:4
    
    
    //进阶:如何手写一个函数,让它具备new+构造函数的功能(举个例子,如何创建一个new_cat函数,让它具备new Cat()功能?)
        function new_cat(name,age){
            //step1:创建一个新的对象{},该对象默认拥有__propto__对象
            let newObj = {}
            newObj.__propto__ = {}
            //step2:构造函数的this指向新的对象{}  this--->{}
            Cat.call(newObj,name,age)
            //step3:构造函数的prototype对象浅复制给新的对象{}的__propto__
            for(let key in Cat.prototype){
                newObj.__propto__[key] = Cat.prototype[key]
            }
             //为什么上面那一步不是newObj.__propto_ = Cat.prototype ?因为这里是浅复制而不是直接赋值
            return newObj
        }
        console.log(new_cat('shouxie',5)) 
        /*
            node输出:
            {     __propto__: Cat { get_name: [Function] },
                name: 'shouxie',
                age: 5
            }
        */
       
       
       //如果重新定义实例的__proto__里的方法会发生什么?
        new Cat('baizhu',1).__proto__.get_name = function(){
            return '手动改变了_propto_:'+this.name
        }
        console.log(new Cat('baizhu',1).get_name()) 
        /*
            node输出:手动改变了_propto_:baizhu
        */
        
        
        
  • 相关阅读:
    eclipse中jdk源码调试步骤
    [POJ2777] Count Color
    [HNOI2004] L语言
    [USACO08DEC] 秘密消息Secret Message
    The XOR Largest Pair [Trie]
    前缀统计 [Trie]
    于是他错误的点名开始了 [Trie]
    Palindrome [Manecher]
    兔子与兔子 [Hash]
    [CF985F] Isomorphic Strings
  • 原文地址:https://www.cnblogs.com/BlueCc/p/11669248.html
Copyright © 2011-2022 走看看