js(三)之高级篇

原型与原型链

每一个构造函数都有一个属性叫做原型。这个属性非常有用:为一个特定类声明通用的变量或者函数。
例子:

function Fish(name, color){
   this.name=name;
   this.color=color;
}
Fish.prototype.livesIn="water";
Fish.prototype.price=20;

var fish1=new Fish("mackarel", "gray");
var fish2=new Fish("goldfish", "orange");
var fish3=new Fish("salmon", "white");
for (int i=1; i<=3; i++){
   alert(fish.name+","+fish.color+","+fish.livesIn+","+fish.price);
}

输出

"mackarel, gray, water, 20"
"goldfish, orange, water, 20"
"salmon, white water, 20"

(1)原型就是一个属性,这个属性是构造函数的属性,构造函数是用来制造用来出对象的,是构造函数制造出来的公共祖先,后面所有的对象都会继承原型的属性与方法(原型也是个对象)

(2)__proto__这个是用来查看原型的,这个是对象的属性,这个属性可以查看但是不能修改(隐式属性)

(3)prototype 设置原型,这个是构造函数的属性

原型继承在开发中经常用到。它有别于类继承是因为继承不在对象本身,而在对象的原型上(prototype)。每一个对象都有原型,在浏览器中它体现在一个隐藏的__proto__属性上。在一些现代浏览器中你可以更改它们。比如在zepto中,就是通过添加zepto的fn对象到一个空的数组的__proto__属性上去,从而使得该数组成为一个zepto对象并且拥有所有的方法。话说回来,当一个对象需要调用某个方法时,它回去最近的原型上查找该方法,如果没有找到,它会再次往下继续查找。这样逐级查找,一直找到了要找的方法。 这些查找的原型构成了该对象的原型链条。原型最后指向的是null。我们说的原型继承,就是将父对像的方法给子类的原型。子类的构造函数中不拥有这些方法和属性。

闭包

闭包概念

当一个内部函数引用了外部函数的变量就产生了闭包。

闭包条件

  • 函数嵌套
  • 内部函数引用外部变量

闭包作用

  1. 使用函数内部变量执行完后,仍然存活在内存中。
  2. 让函数外部可以操纵内部数据。

js的单线程模型

浏览器进程由很多线程组成:

  • 主线程包括以下模块:
  1. js引擎模块:负责js程序的编译运行。
  2. html,css文档解析模块:负责文本页面的解析。
  3. DOM/CSS模块:负责dom/css模块在在内存中的相关处理。
  4. 布局和渲染模块:负责页面的布局和效果的绘制。
  • 分线程包括以下模块:
  1. 定时器模块,负责定时器管理。
  2. 事件响应模块:负责事件的管理。
  3. 网络请求模块:负责ajax请求。

为什么js引擎需要单线程

因为js需要操作DOM,这就决定了js必须是单线程模型。如果多线程操作DOM,会存在多线程同步安全问题。

js代码分类

  • 初始化代码:在主线程中执行,执行后进入eventloop状态执行回调代码。
  • 回调代码:包括定时器回调函数,事件响应回调函数,ajax回调函数。

js代码执行流程

先执行初始化代码,后面在某一时刻执行回调代码。

事件循环模型

在这里插入图片描述

回调函数存在一个叫callback_queue的回调队列中,采用轮询的方式选择执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值