new与构造函数

Posted bluecc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
    */
    
    
    

 

以上是关于new与构造函数的主要内容,如果未能解决你的问题,请参考以下文章

实例对象与new命令

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

在 Visual Studio 中创建构造函数的代码片段或快捷方式

new与构造函数

new一个对象后面加括号与不加括号的区别