深夜睡不着,第二篇随笔,说说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的创建实例化过程的主要内容,如果未能解决你的问题,请参考以下文章

深夜随想

第二篇 设计模式之单例模式

上夜班,白天睡不着怎么办?

linux-0.11分析:boot文件 setup.s 第二篇随笔

短学期第二篇随笔

看不到Harbor我也睡不着觉啊