码迷,mamicode.com
首页 > 其他好文 > 详细

new与构造函数

时间:2019-10-14 00:57:44      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:没有   this   cal   return   函数   重新定义   func   属性   例子   

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
    */
    
    
    

 

new与构造函数

标签:没有   this   cal   return   函数   重新定义   func   属性   例子   

原文地址:https://www.cnblogs.com/BlueCc/p/11669248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!