Skip to content

1.三年社招虾皮

  1. 在构造函数中判断是否为被new调用

考点:

  1. new 关键字调用构造函数的时候会发生什么
    1. 创建一个空的JavaScript对象{}
    2. 将步骤1创建的对象的原型指向构造函数的原型对象
    3. 将步骤1新创建的对象作为this的上下文
    4. 如果该函数没有返回对象,则返回this
  2. 这题的关键点就在于步骤二,空对象的原型到底指向哪里
  3. 简单的测试可以发现,car1 car2执行时的this分别是本身和window
javascript
function Car(make, model, year) {
  console.log(this)
  this.make = make;
  this.model = model;
  this.year = year;
}

const car1 = new Car('Eagle', 'Talon TSi', 1993);
const car2 = Car(1,2,2)
  1. 由此可以在函数中使用this instanceOf Person判断this的指向问题
  2. 但其实用instanceOf判断是有漏洞的,比如用call调用的方式传入已实例化的对象,这样就满足既不是用new,但是instanceOf判断又是true的。
  3. 需要更准确的,可以使用new.target,如果是new调用,则会返回一个指向构造方法或函数的引用,否则返回undefined。详见new.target
  4. car1 的隐式原型等于它的构造函数的显式原型:car1.__proto__ === Function.prototype

todo 2. 实现instanceOf

  1. 实现一个函数继承另一个函数
javascript
function Person(name) {
  this.name = name
}
Person("Hello")
new Person("Hello")

function Student(grade, name) {
   Person.call(this)
   this.grade = grade
   this.name = name
}
Student.prototype = Object.create(Person.prototype)
Student.prototype.Constructor = Student // 不解为啥要重新指向
Student.prototype.getGrade = function () {
return this.grade
}