先来点开胃菜,解释一下变量提升
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