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与构造函数的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段