JS经常出在面试的问题,闭包,prototype和constructor

昨天面试,面试官问我JS好不好,我说非常好。面试官说那好,闭包是什么,跟我介绍一下吧~


说实话,这不是我第一次碰到这样的问题。至少是第三次,然而我仍然没有正视过这个问题。我正视了一些C++问题比如说虚函数表,虽说还有缺憾,但是这个问题没有,当时心里转了一圈,知道这篇博文应该写下来,并且分享一下了。


1 有关JS本身的语言特性

JS是一种面向原型的语言,说道原型,我开始以为有多厉害,因为以前都是面向对象,面向过程这种对着内存编程的语言……看过设计模式之后才明白这是面向对象的一种,是对象创建型模式的一种。

[摘自设计模式]

(Prototype)意图, 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象


我认为在C++里面,就是定义虚的prototype的,这个prototype有个通用的复制自我的接口,就是clone,clone按照实际用法从下到上复制个遍,或者单独复制自己,并存一份上面的reference。

JS里面应该是后者,每次调用构造函数,不会产生上一级Object的clone,而是reference。

2 闭包

wiki上面说的非常够用

闭包的Wiki链接

简单感觉就是调用过的函数A,返回一个函数B,B仍然可以访问、改变A里面的变量,由于A里面的变量都是私有的,所以B只要不引用外部变量,在这里就是相对封闭的环境。在我来说,闭包经常用来构造相对灵活的Object。无名函数的重要应用就是为了那一小块私有位置啊!

function () {
//private operations and variables
  return {
    //public operations and variables
  };
}

这就是我的经常性用法,这里面提到了一个return,可以说,return这种东西就是prototype的大杀器!用了这种形式的return的函数基本上就和prototype绝缘了!但是这样构成的模块是异常清晰的,代码也非常稳定,不会因为乱改其他object,突然发现别的object连带着改掉,而且由于prototype层数少在效率上也是很不错的。

如果把这些返回的object注册到全局或者是某函数的闭包变量里面,限定访问函数和注册函数,这就是requirejs的一部分基本框架了。

3 Prototype 和 constructor

prototype是构造函数的一个属性,不是实例的属性。但是实例可以明显的感觉到原型链的能力。constructor我感觉比较奇异,constructor指向构造函数这个貌似不是约定。但是构造函数有两种,第一种就是普通函数,这个是通常意义上的构造函数(构造函数不能搞return),第二种就是Object,随手创建的{one:1}这样的Object的构造函数都是Object。通过构造函数的级联可以正常的产生prototype的值

非常正统的一篇,主要注意这样级联

比如A是基本构造函数,a是A构造的实例,B->prototype = a,b是B的构造函数,那么b的constructor是A(函数),反过来看a的constructor也是A,挺奇葩的……需要手动改成B才行,所以类操作给人一种庸人自扰的感觉。

通过Object.create也可以产生原型链

a = {one: 1};
b = Object.create(a); // b.constructor = function Object() {}

new是必要的,因为没有new,this不会工作。而且对于一些build-in的函数Date,Date()返回一个字符串,new Date()返回一个Date对象。

return一般就直接覆盖了了Object,prototype什么的就直接没有太多意义了。当然你也可以返回一个带有其他prototype的object,不过这样的话何苦搞它一个构造函数,用this折腾呢~

MDN上Object.create里面剖析了用object.create建立继承的过程,这个继承的问题就是很难通过子类找到父类,父类自己的constructor也变得难用了,后面还有一些非常奇异的第二参数用法,估计IE上面不能通用。

MDN的Object.create链接

有一篇写面向对象稍微好些的文章,就是代码比较乱。约定就是用constructor指向当前的构造器,直接弄了成员函数,覆盖掉prototype的默认值,看上去是好的。

JS constructor实际作用分析

实际作用就是没有太大作用(逃……

4 还有一个问题就是问函数生成多个实例,闭包是否互相影响?

要是不破坏闭包,自然无事,要是破坏了闭包,比如引用外面的参数,用外面的东西当prototype,自然另说。

你可能感兴趣的:(JavaScript)