原型和原型链:
题目,知识点,解答;
1.如何准确地判断一个变量是数组类型
2.写一个原型链继承的例子
3.描述new一个对象的过程
4.zepto(或其他框架)源码中如何使用原型链。
知识点
构造函数:
构造函数-扩展
原型规则和示例:
原型链:
instanceof:
构造函数:
function Foo(name,age){
this.name = name
this.age = age
this.class = 'class-1'
}
var f = new Foo('Zhang','20')
构造函数-扩展:
原型规则和示例:
5条原型规则,原型规则是学习原型链的基础
1.所有的引用类型(数组,对象,函数),都具有对象特性,即可自由扩展属性(除了,null,意外)
2.3.所有的引用类型(数组,对象,函数),都具有一个_proto_(隐士原型)属性,属性值是一个普通的对象,直接指定他的构造函数的prototype属性值,直接指向他的构造函数的
prototype类型属性值。
4.所有的函数,都有一个prototype(显示)属性,属性值也是一个普通的对象。
5.当试图得到一个对象的属性值时,如果这个对象本身没有这个属性,那么会去他的__proto__(即他的构造函数的prototype)中寻找。
循环对象自身的属性
原型链:
作用域和闭包:
范围:一段<script>或者一个函数
全局:变量定义,函数声明。
函数:变量定义,函数声明,this,arguments
全局声明:就是把变量的声明都放到前面去。
call,apply,bind:
fn() function fn1(name,age){ alert(name) console.log(this) } fn1.call({x:100},'zhangshan',20) var fn2 = function (name,ag){ alert(name) console.log(this) }.bind({y:200}) fn2.call({x:100},'zhangshan',20)
作用域链:
在自己的下的小函数体内没有,去上一级作用域找没有在去上一级查找,这个叫作用域链。
//块级作用域 var name if(true){ name = 'zhangshan' } console.log(name) // //作用域,a是一个全局作用域 var a = 100; function fn(){ var b = 200 console.log(a) //自由变量 console.log(b) } fn() //作用域链 var a = 100 function f1() { var b = 200 function f2(){ var c = 300 console.log(a) console.log(b) console.log(c) } f2() } f1()
闭包:
闭包的使用场景
函数作为一个返回值(返回上一个demo)
函数作为参数传递(自己思考)
function F1(){ var a = 100 return function () { console.log(a) //自由变量,父作用域寻找 } } var f1 = F1() var a = 200 f1() //函数作为返回值 //函数作为参数传递 function F1(){ var a = 100 return function () { console.log(a) //自由变量,父作用域寻找 } } var f1 = F1() function F2(fn){ var a = 200 fn() } F2(f1)
闭包的总结:
变量的提升:变量的定义,函数的声明
说明this的几种不同使用场景:作为构造函数的执行,作为普通函数的执行,call,Apply ,bind
作用域和闭包的解题代码: