动画:《大前端吊打面试官系列》 之原生 JavaScript 精华篇( 四 )


一般 Java 中,声明一个构造函数,通过 new 类名() 来创建一个实例,而这个构造函数 是一种特殊的函数 。但是在 JS 中,只要 new 一个函数,就可以 new 一个对象,函数和构造函数没有任何的区别 。
面试官:new 内部发生了什么过程?可不可以手写实现一个 new 操作符?
new 的过程包括以下四个阶段:
// new 生成对象的过程// 1、生成新对象// 2、链接到原型// 3、绑定 this// 4、返回新对象// 参数:// 1、Con: 接收一个构造函数// 2、args:传入构造函数的参数function create(Con, ...args){// 创建空对象let obj = {};// 设置空对象的原型(链接对象的原型)obj._proto_ = Con.prototype;// 绑定 this 并执行构造函数(为对象设置属性)let result = Con.apply(obj,args)// 如果 result 没有其他选择的对象,就返回 obj 对象return result instanceof Object ?result : obj;}// 构造函数function Test(name, age) {this.name = namethis.age = age}Test.prototype.sayName = function () {console.log(this.name)}// 实现一个 new 操作符const a = create(Test,'小鹿','23')console.log(a.age)
面试官:有几种创建对象的方式,字面量相对于 new 创建对象有哪些优势?
最常用的创建对象的两种方式:
其他创建对象的方式:
字面量创建对象的优势所在:
对于 .()方式创建对象:
Object.create(proto, [propertiesObject]);
一般用于继承:
var People = function (name){this.name = name;};People.prototype.sayName = function (){console.log(this.name);}function Person(name, age){this.age = age;People.call(this, name);// 使用call,实现了People属性的继承};// 使用Object.create()方法,实现People原型方法的继承,并且修改了constructor指向Person.prototype = Object.create(People.prototype, {constructor: {configurable: true,enumerable: true,value: Person,writable: true}});Person.prototype.sayAge = function (){console.log(this.age);}var p1 = new Person('person1', 25);p1.sayName();//'person1'p1.sayAge();//25
面试官:new/字面量 与 .(null) 创建对象的区别?
闭包
闭包面试中的重点,但是对于很多初学者来说都是懵懵的,所以俺就从最基础的作用域讲起,大佬请绕过 。
面试官:什么是作用域?什么是作用域链?
规定变量和函数的可使用范围叫做作用域 。只看定义,挺抽象的,举个例子:
function fn1() {let a = 1;}function fn2() {let b = 2;}
声明两个函数,分别创建量两个私有的作用域(可以理解为两个封闭容器),fn2 是不能直接访问私有作用域 fn1 的变量 a 的 。同样的,在 fn1 中不能访问到 fn2 中的 b 变量的 。一个函数就是一个作用域 。
每个函数都会有一个作用域,查找变量或函数时,由局部作用域到全局作用域依次查找,这些作用域的集合就称为作用域链 。如果还不是很好理解,俺再举个例子?:
let a = 1function fn() {function fn1() {function fn2() {let c = 3;console.log(a);}// 执行 fn2fn2();}// 执行 fn1fn1();}// 执行函数fn();
虽然上边看起来嵌套有点复杂,我们前边说过,一个函数就是一个私有作用域,根据定义,在 fn2 作用域中打印 a,首先在自己所在作用域搜索,如果没有就向上级作用域搜索,直到搜索到全局作用域,a = 1,找到了打印出值 。整个搜索的过程,就是基于作用域链搜索的 。
面试官:什么是闭包?闭包的作用?闭包的应用?