原型与原型链
每一个构造函数都有一个属性叫做原型。这个属性非常有用:为一个特定类声明通用的变量或者函数。
例子:
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。我们说的原型继承,就是将父对像的方法给子类的原型。子类的构造函数中不拥有这些方法和属性。
闭包
闭包概念
当一个内部函数引用了外部函数的变量就产生了闭包。
闭包条件
- 函数嵌套
- 内部函数引用外部变量
闭包作用
- 使用函数内部变量执行完后,仍然存活在内存中。
- 让函数外部可以操纵内部数据。
js的单线程模型
浏览器进程由很多线程组成:
- 主线程包括以下模块:
- js引擎模块:负责js程序的编译运行。
- html,css文档解析模块:负责文本页面的解析。
- DOM/CSS模块:负责dom/css模块在在内存中的相关处理。
- 布局和渲染模块:负责页面的布局和效果的绘制。
- 分线程包括以下模块:
- 定时器模块,负责定时器管理。
- 事件响应模块:负责事件的管理。
- 网络请求模块:负责ajax请求。
为什么js引擎需要单线程
因为js需要操作DOM,这就决定了js必须是单线程模型。如果多线程操作DOM,会存在多线程同步安全问题。
js代码分类
- 初始化代码:在主线程中执行,执行后进入eventloop状态执行回调代码。
- 回调代码:包括定时器回调函数,事件响应回调函数,ajax回调函数。
js代码执行流程
先执行初始化代码,后面在某一时刻执行回调代码。
事件循环模型
回调函数存在一个叫callback_queue的回调队列中,采用轮询的方式选择执行。