JS实战进阶笔记2

目录

一 分号问题

二 函数的prototype

显式原型和隐式原型

 原型链

 三  原型链_属性问题 

四 搜索instanceof

 五 原型_面试题

 六 变量提升和函数提升

 七 执行上下文

栈(后进先出)


一 分号问题

js一条语句的后面可以不加分号
是否加分号是编码风格问题,没有应该不应该,只有你自己喜欢不喜欢

在下面2种情况下不加分号会有问题
   1)小括号开头的前一条语句
   2)中方括号开头的前一条语句解决办法:在行首加分号

二 函数的prototype

函数的prototype属性
每个函数都有一个prototype属性,它默认指向一个object空对象(即称为:原型对象)

原型对象中有一个属性constructor,它指向函数对象
给原型对象添加属性(一般都是方法)
作用:函数的所有实例对象自动拥有原型中的属性(方法)


显式原型和隐式原型

      每个函数function都有一个prototype,即显式原型(属性)

      每个实例对象都有一个__proto__,可称为隐式原型(属性)

      对象的隐式原型的值为其对应构造函数的显式原型的值

   总结:
      函数的prototype属性:在定义函数时自动添加的,默认值是一个空0bject对象
      对象的__proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值

       程序员能直接操作显式原型,但不能直接操作隐式原型(ES6之前)

JS实战进阶笔记2_第1张图片

JS实战进阶笔记2_第2张图片

 原型链

  访问一个对象的属性时,先在自身属性中查找,找到返回,如果没有,再沿着__proto__这条链向上查找,找到返回。如果最终没找到,返回undefined
   别名:隐式原型链
   作用:查找对象的属性(方法)
JS实战进阶笔记2_第3张图片

 所有函数的__proto__都是一样的,等于构造函数的显式原型。

   函数的显示原型指向的对象默认是空object实例对象(但object不满足)
   所有函数都是Function的实例(包含Function)
   object的原型对象是原型链尽头
JS实战进阶笔记2_第4张图片

 三  原型链_属性问题 

   读取对象的属性值时:会自动到原型链中查找
  设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值     方法一般定义在原型中,属性一般通过构造函数定义在对象本身上

四 搜索instanceof

   instanceof是如何判断的?表达式:A  instanceof  B
   如果B函数的显式原型对象在A对象的原型链上,返回true,否则返回false(可结合下转载图判断)

JS实战进阶笔记2_第5张图片

    Function是通过new自己产生的实例

JS实战进阶笔记2_第6张图片

 五 原型_面试题

面试题1:

JS实战进阶笔记2_第7张图片

面试题2:

JS实战进阶笔记2_第8张图片

 六 变量提升和函数提升

变量声明提升:
通过var定义(声明)的变量,在定义语句之前就可以访问到值: undefined
函数声明提升:
通过function声明的函数,在之前就可以直接调用值:函数定义(对象)
JS实战进阶笔记2_第9张图片

 七 执行上下文

  1)代码分类(位置)

        全局代码
         函数(局部)代码

2)全局执行上下文
  在执行全局代码前将window确定为全局执行上下文对全局数据进行预处理
        var定义的全局变量==>undefined,添加为window的属性
        function声明的全局函数==>赋值(fun),添加为window的方法

       this==>赋值(window)
  开始执行全局代码
3)函数执行上下文
   在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象(虚拟的,存在于栈中)对局部数据进行预处理
       形参变量==>赋值(实参)==>添加为执行上下文的属性
      arguments==>赋值(实参列表),添加为执行上下文的属性

      var定义的局部变量==>undefined,添加为执行上下文的属性

     function声明的函数==>赋值,添加为执行上下文的方法

     this==>赋值(调用函数的对象)
开始执行函数体代码


栈(后进先出)

  在全局代码执行前,JS引擎就会创建一个栈来存储管理所有的执行上下文对象在全局执行上下文(window)确定后,将其添加到栈中(压栈)
  在函数执行上下文创建后,将其添加到栈中(压栈)
  在当前函数执行完后,将栈顶的对象移除(出栈)当所有的代码执行完后,栈中只剩下window
 

你可能感兴趣的:(javascript,前端)