JS 面试题: 将class转为function
关于类-需知知识点:
1、ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class
关键字,可以定义类
基本上,ES6 的class
可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class
写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
2、类的所有方法都定义在类的prototype
属性上面。
3、ES6 的类,完全可以看作构造函数的另一种写法。
class Point {
// ...
}
typeof Point // "function"
Point === Point.prototype.constructor // true
关于new-需知知识点:
1、通过use strict
普通调用时严格模式下this
指向undefined
,赋值操作会报错,new调用时this指向实例对象。
var Person = function () { 'use strict'; try { this.name = 'BabyChin'; console.log('new调用'); } catch (e) { console.log('普通调用'); } } var p1 = new Person(); // new调用 var p2 = Person(); // 普通调用
2、通过instanceof
普通调用时this
指向全局对象
,new
调用时this
指向实例对象
。
var Person = function () { if (this instanceof Person) { console.log('new调用'); } else { console.log('普通调用'); } } var p1 = new Person(); // new调用 var p2 = Person(); // 普通调用
3、通过constructor
普通调用时constructor
指向全局对象
,new
调用时constructo
r指向构造函数本身
。
var Person = function () { if (this.constructor === Person) { console.log('new调用'); } else { console.log('普通调用'); } } var p1 = new Person(); // new调用 var p2 = Person(); // 普通调用
4、通过new.target
普通调用时target
默认指向undefined
,new
调用时target
指向Person
的实例对象。
var Person = function () { if (new.target === Person) { console.log('new调用'); } else { console.log('普通调用'); } } var p1 = new Person(); // new调用 var p2 = Person(); // 普通调用