1、原型定义
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
* 这个属性对应着一个对象(默认指向一个Object空对象),这个对象就是我们所谓的原型对象
console.log(Date.prototype)
// 原型对象中有一个属性constructor, 它指向函数对象
console.log(Date.prototype.constructor===Date)//true
2、显示原型与隐式原型
每个函数function都有一个prototype,即显式原型
每个实例对象都有一个__proto__,可称为隐式原型
function Fn() {
}
var fn = new Fn()
console.log(显示:Fn.prototype,隐式: fn.__proto__)
console.log(Fn.prototype===fn.__proto__)//true
二者之间的关系:相等
3、原型链(图解) 别名: 隐式原型链
访问一个对象的属性时,
* 先在自身属性中查找,找到返回
* 如果没有, 再沿着__proto__这条链向上查找, 找到返回
* 如果最终没找到, 返回undefined
4、属性问题
1.读取对象的属性值时: 会自动到原型链中查找
2. 设置对象的属性值时: 不会查找原型链, 如果当前对象中没有此属性, 直接添加此属性并设置其值
3. 方法一般定义在原型中, 属性一般通过构造函数定义在对象本身上
function Fn(){
}
Fn.prototype.a ="xxx";
var fn1 = new Fn();
console.log(fn1.a,fn1);
var fn2 = new Fn();
fn2.a = "eee"
console.log(fn2.a,fn2);
5、变量提升与函数提升
. 变量声明提升
* 通过var定义(声明)的变量, 在定义语句之前就可以访问到
* 值: undefined
2. 函数声明提升
* 通过function声明的函数, 在之前就可以直接调用
* 值: 函数定义(对象)
先预处理变量, 后预处理函数
6、执行上下文
1. 全局执行上下文
* 在执行全局代码前将window确定为全局执行上下文
* 对全局数据进行预处理
* var定义的全局变量==>undefined, 添加为window的属性
* function声明的全局函数==>赋值(fun), 添加为window的方法
* this==>赋值(window)
* 开始执行全局代码
2. 函数执行上下文
* 在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象
* 对局部数据进行预处理
* 形参变量==>赋值(实参)==>添加为执行上下文的属性
* arguments==>赋值(实参列表), 添加为执行上下文的属性
* var定义的局部变量==>undefined, 添加为执行上下文的属性
* function声明的函数 ==>赋值(fun), 添加为执行上下文的方法
* this==>赋值(调用函数的对象)