1.三年社招虾皮
- 在构造函数中判断是否为被new调用
考点:
- new 关键字调用构造函数的时候会发生什么
- 创建一个空的JavaScript对象{}
- 将步骤1创建的对象的原型指向构造函数的原型对象
- 将步骤1新创建的对象作为this的上下文
- 如果该函数没有返回对象,则返回this
- 这题的关键点就在于步骤二,空对象的原型到底指向哪里
- 简单的测试可以发现,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)
- 由此可以在函数中使用
this instanceOf Person
判断this的指向问题 - 但其实用
instanceOf
判断是有漏洞的,比如用call调用的方式传入已实例化的对象,这样就满足既不是用new,但是instanceOf判断又是true的。 - 需要更准确的,可以使用new.target,如果是new调用,则会返回一个指向构造方法或函数的引用,否则返回undefined。详见new.target 。
- car1 的隐式原型等于它的构造函数的显式原型:
car1.__proto__ === Function.prototype
。
todo 2. 实现instanceOf
- 实现一个函数继承另一个函数
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
}