前端面试题

本文讲解了JavaScript变量提升的概念、闭包的工作原理及其内存影响,还介绍了构造函数、原型和`arguments`的用法。通过实例演示,探讨了Animal类的构造函数、原型链和子类扩展。最后,剖析了对象属性判断和原型链的复杂性。
摘要由CSDN通过智能技术生成

先来点开胃菜,解释一下变量提升

Js编译过程中,先创建上下文环境,此时把var声明提前,然后在执行代码(包括变量的使用,变量的赋值等),没赋值之前使用。

什么是闭包?

是个函数(本质),引用了外层函数的变量或参数的函数,一旦外层函数的外部被调用,就产生了闭包。缺点:浪费内存
定义:闭包就是能够读取其他函数内部变量的函数。在js中,可以将闭包理解成“函数中的函数“。

arguments是什么?怎么用?

实参列表,只在函数体内存在,是数组形式;用法:可以用for遍历
arguments.callee arguments所在的函数
arguments.callee.caller 执行这个函数的函数

解释一下构造函数,实例,原型三者的关系

new构造函数生成的实例,实例的__proto__是构造函数的原型,原型的constructor是构造函数本身。

如何检测属性是否是对象自身属性?

对象.hasOwnProperty(属性名)
例:构造函数:function Animal(){}
实例化对象:dog=new Animal();

正餐开始!

1.Animal的构造函数是什么?

var Animal=new Function(){};
Animal.constructor=function Function(){}

2.Animal的原型对象是什么?

Animal.prototype={constructor:function(){}}

3.Animal原型对象的构造函数是什么?

Animal.prototype.constructor=function Animal(){}
//构造函数的原型对象的constructor是构造函数本身

4.dog的原型对象是什么?

dog.prototype=undefined;

5.dog._proto_是什么?

_proto_:指向原型 dog._proto_=Animal.prototype={constructor:function(){}}实例的__proto__指向构造函数的prototype.

6.dog.proto._proto_是什么?

Animal.prototype._proto_=Object.prototype

7.Animal.prototype._proto_是什么?

Animal.prototype._proto_=Object.prototype

8.dog.constructor是什么?

//实例对象的constructor就是构造函数
dog.constructor=function Animal(){}

//完成Dog、Cat、Mouse类,继承Animal
function Dog(type,name,color){
	Animal.call(this,type,name,color);
}
Dog.prototype=Object.create(Animal.prototype);
function Cat(type,name,color){
	Animal.call(this,type,name,color);
}
Cat.prototype=Object.create(Animal.prototype);
function Mouse(type,name,color){
	Animal.call(this,type,name,color);
}
Mouse.prototype=Object.create(Animal.prototype);
//为Cat添加run方法
Cat.prototype.run=function(){
	console.log([this.color,this.name,this.type]);
}
//为Mouse添加jump方法
Mouse.prototype.jump=function(s){
	return {distance:s};
}

9.完成Animal构造函数

function Animal(name,color,type){
	this.name=name;
	this.color=color;
	this.type=type; 
}

9.1.Animal的构造函数

Animal.constructor=function Function(){}

9.2.如何判断Animal的原型在不在erha的原型链上?

Animal(Object).prototype.isPrototypeOf(erha) 返回:true
//erha instanceof Animal(Object)
Animal.prototype.show=function(){
console.log(this.name+"是一只"+this.color+"的"+this.type);
}
var erha=new Dog("二哈","白色","狗");
erha.show();//二哈是一只白色的狗
var tom=new Cat("黑色","汤姆","猫");
tom.run();//["猫","汤姆","黑色"];
var jerry=new Mouse("老鼠","杰瑞","灰色");
jerry.jump(5).distance;//5
var obj=Object.create(Mouse.prototype);

10.写出tom的原型链

tom.__proto__-->Cat.prototype Cat.prototype.__proto__-->Animal.prototype Animal.prototype.__proto__-->Object.prototype tom.__proto__.__proto__.__proto__=Object.prototype

11.写出obj的原型链

obj->obj.__proto__.__proto__.__proto__=Object.prototype

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值