腾讯前端面试题(一)

一. 有一个类如下:

function Person(name) {
    this.name = name
}

let p = new Person('Tom');

1. p._proto_等于什么?

答案:Person.prototype

2. Person._proto_等于什么?

答案:Function.prototype

解析:

1,2两个是同一个问题,都是考察原型链相关知识,只需要记住一句: 实例的_proto_属性(原型)等于其构造函数的prototype属性。实例p的构造函数为Person,而Person的构造函数为Function。

触类旁通

var f = {}
    F = function (){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';

console.log(f.a)
console.log(f.b)
console.log(F.a)
console.log(F.b)

结果:

value a;

undefined;

value a;

value b;

解析:

f是Object的实例,F是Function的实例,对象的属性会顺着原型链一层一层向上查找,找不到则为undegined

3. 若将题干改为

function Person(name) {
    this.name = name
    return name
}
let p = new Person('Tom')

实例化Person过程中,Person返回什么(或者p等于什么)?

答案:

 {name: "Tom"}

4.若将题干改为

function Person(name) {
    this.name = name
    return {}
}
let p = new Person('Tom');

实例化Person过程中,Person返回什么(或者p等于什么)?

{}

解析:

构造函数不需要显式的返回值。使用new来创建对象(调用构造函数)时,如果return的是非对象(数字、字符串、布尔类型等)会忽略返回值;如果return的是对象,则返回该对象(注:若return null也会忽略返回值)。

5. typeof和instanceof的区别

在JavaScript中,判断一个变量的类型常常会用typeof运算符,在使用typeof运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回'object'。

instanceof运算符用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性。语法:object instanceof constructor 参数: object(要检测的对象)constructor(某个构造函数)描述:instanceof 运算符用来检测constructor.prototype是否存在于参数object的原型上。

6. 如果Student inherit from Person(Student类继承Person,需是基于原型的继承),let s = new Student('Lily'),那么s instanceof Person返回什么?

function Person(name) {
    this.name = name
}
function Student() {

}

Student.prototype = Person.prototype;
Student.prototype.constructor = Student;

let s = new Student('Tom');
console.log(s instance Person);

答案: true

7. new和instanceof的内部机制

1. 创建一个新对象,同时继承对象类的原型,即Person.prototype;
2. 执行对象类的构造函数,同时该实例的属性和方法被this所引用,即this指向新构造的实例;
3. 如果构造函数return了一个新的‘对象’,那么这个对象就会取代真个new出来的结果,如果构造函数没有return对象,那么就会返回步骤1所创建的对象,即隐式返回this。(一般情况下构造函数不会返回任何值,不过在一些特殊情况下,如果用户想覆盖这个值,可以选择返回一个普通的对象来覆盖)

猜你喜欢

转载自blog.csdn.net/RedaTao/article/details/85118891