深夜睡不着,第二篇随笔,说说js的创建实例化过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深夜睡不着,第二篇随笔,说说js的创建实例化过程相关的知识,希望对你有一定的参考价值。
媳妇白天加班太累了,我呢,白天睡太多了,晚上太过于亢奋,自己一个人偷偷的拿着笔记本到客厅写博客~
上一篇可能很多人看到了觉得就是个joke,那个真的是一个joke,但是在实际开发过程中,很多年轻的coder对于写不写分号很不以为然,要知道,真实生产环境下的代码要远比我栗子中给的代码要复杂得多,因此很有可能不用我的误导,你就看不出来,因此浪费了一下午的宝贵开发时间,所以写代码还是要规范一些。
第二篇文章我依旧不想讲太过于深入的技术,还是说两个“花边新闻”,聊以自慰罢了,看官有兴致你就看,没兴致也可以喷。
依旧是这样的一个题目:
1 var Model = function(p){ 2 this.p = p; 3 }; 4 var model = new Model(1); 5 6 console.log(model.constructor); 7 console.log(Model); 8 console.log(Model === model.constructor);
很简单的一个实例化过程,由于没啥心情,所以直接就不卖关子了,直接把要讲的点,给console.log出来
此处我也就不自问自答了,直接说吧,打印结果是:
function Model(p) function Model(p) true
到这里可能懂得人就懂我要说什么了,不懂得人还是不懂我要说什么,貌似是一句废话= =+
大家能够看到,打印的model.constructor就是Model。
对的,和所有的程序设计一样,当new一个对象的时候,会自动执行这个对象的构造函数,就是这里的Model。
然后我们做一个貌似只有js这样的变成语言才能做的事情,动态修改一下Model:
1 var Model = function(p){ 2 this.p = p; 3 }; 4 var model = new Model(1); 5 6 console.log(model.constructor); 7 console.log(Model); 8 console.log(Model === model.constructor); 9 10 Model = function(x){ 11 console.log(1); 12 } 13 14 console.log(model.constructor); 15 console.log(Model); 16 console.log(Model === model.constructor);
打印结果如下:
function Model(p) function Model(p) true function Model(p) function Model(x) false
从这段代码中我们可以得知,当动态的修改Model的时候并不会影响已经被实例化出来的model对象的构造函数。
也就是说,一旦Model被实例化,那么该实例的构造函数就是确定的,并且该实例和Model已经没有半毛钱关系了。
下面我要讲的可能是有些跳跃了,就是试图自己来做一下这个过程:
1 var Model = function(p){ 2 this.p = p; 3 }; 4 var model = new Object(); 5 model.__proto__ = Model.prototype; 6 console.log(model.constructor); 7 var model2 = new Model(1); 8 console.log(model2.constructor);
9 console.log(model.constructor === model2.constructor);
打印结果我们可以看到,两者的constructor是一毛一样的
function Model(p) function Model(p) true
然后我们在做如下处理:
1 var Model = function(p){ 2 this.p = p; 3 }; 4 var model = new Object(); 5 model.__proto__ = Model.prototype; 6 console.log(model.constructor); 7 var model2 = new Model(1); 8 console.log(model2.constructor); 9 console.log(model.constructor === model2.constructor); 10 11 Model.call(model,1); 12 console.log(model); 13 console.log(model2); 14 console.log(model.constructor === model2.constructor);
打印结果如下:
function Model(p) function Model(p) true Object {p: 1} Model {p: 1} true
也就是说此时,除了一个被打印出来是Object 一个被打印出来是Model,其他的这两个实例没有任何区别,一样的构造函数,一样的成员数量和名称
下面来让我简短的总结下这次我说了什么:
实例化一个对象实际上是先实例化了一个Object的对象model,然后把该对象的原型指向Model的原型,然后再用该对象调用Model的构造函数,从而初始化该对象的所有成员,此时该对象的构造函数和Model没有任何关系,即使动态修改了Model,也不会对model产生任何影响了。
小生才疏学浅,如有不对,还望指正!
今天就到这里了,估计也是没人看,如果有人看,我还会准备一些有意思的东西的。
以上是关于深夜睡不着,第二篇随笔,说说js的创建实例化过程的主要内容,如果未能解决你的问题,请参考以下文章