Js高级原型与原型链

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==>赋值(调用函数的对象)

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值