关于构造函数和原型
1.利用 new object()创建对象
`var obj1 = new object() `
2.利用 对象字面量创建对象
`var obj2 = {}`
3.利用构造函数创建对象
`function Star (uname,age){
this.uname = uname
this.age=age
this.sing=function(){
console.log('我会唱歌')
}
}
var ldh = new Star('刘德华',18)
console.log(ldh)
`
new在执行时会做的4件事情
1.在内存中创建一个空的新对象
2.让this指向这个新的对象
3.执行构造函数里面的代码,给这个新的对象添加属性和方法
4.返回这个新对象(所以构造函数中 不需要return)
4.实例成员就是构造函数内部通过this添加的成员 uname age sing 就是实例成员
实例成员只能通过实例化对象来访问,不可以通过构造函数来访问实例成员
静态成员 在构造函数本身添加的成员 静态成员只能通过构造函数来访问
*关于构造函数的原型对象
1.构造函数通过原型分配的函数是所有对象所共享的 每一个构造函数都有一个prototype属性,
指向另一个对象
所以原型是一个对象,我们也称为prototype原型对象它主要的作用就是共享方法
对象身上都会有一个属性__proto__指向构造函数原型对象,
之所以对象可以使用构造函数prototype原型 对象和属性方法,
就是因为对象有__proto__原型的存在对象原型(__proto__)和构造函数(prototype)
原型对象里面都有一个属性construtor属性,construtor我们称为构造函数因他指向构造函数本身,
construtor主要用于记录该对象引用哪个构造函数,它可以让原型对象指向原来的构造函数
*构造函数,实例,原型对象三者之间的关系
先有一个构造函数,每一个构造函数里面都有一个原型对象,
是通过构造函数的prototype指向这个原型对象的,
同样在这个原型对象身上有一个属性叫做constructor指向这个构造函数
(这是构造函数和原型对象之间的关系)
可以通过构造函数来创建一个实例对象 只要new了就产生一个实例对象,
在这个实例对象里面也有一个原型叫做__proto__他指向原型对象,
在实例对象里面也有一个counstructor可以指回构造函数
*原型链
在star原型对象身上有一个 prototype.__proto__
它指向Object原型对象的prototype,object原型对象是由object构造函数创建出来,
他身上的prototype指向Object,Object身上的
constructor指向object原型对象,Object原型对象身上的__proto__指向null
*原型对象的this指向
1.在构造函数中,里面的this指向的是对象实例
2.原型对象函数里面的this 指向的是实例对象
call()方法可以改变函数的this指向
*es5中新增的方法
数组中提供了一些遍历方法:forEach(),map(),fliter(),some(),every()
forEach()的使用
array.forEach(function(value,index,arr))
*value:每个数组元素
*index:数组当前项的索引值
*arr:数组对象本身
fliter()的使用
fliter()方法创建一个新的数组,
数组中的元素是通过检查指定数组中符合条件的所有元素,主要用于筛选数组
*注意 他直接返回一个新的数组
*value 数组当前项目的值
*index数组当前项的索引
*arr数组对象的本身
some()的使用
some()方法主要用于检测元素是否满足条件,
*注意 他返回的是布尔值,有返回 true,没有返回 false
*value 数组当前项目的值
*index数组当前项的索引
*arr数组对象的本身
some()和forEach的区别
1.在forEach遍历中,return不会终止迭代
2.在some遇到return true 会终止遍历 迭代效率更高
函数内部的指向
1.普通函数调用 this指向window
2.构造函数调用 实例对象,原型对象里面的方法也指向实例对象
3.对象方法调用 该方法所属对象
4.事件绑定方法 绑定事件对象
5.定时器函数 window
6.立即执行函数 window
函数内部的指向
js中处理this指向的问题 常用的有bind(),call(),apply()三种方法
1.call方法
call()方法调用一个对象。但是它可以改变this指向
call()的主要作用可以实现继承
2.apply方法
也是调用函数,第二个可以改变函数内部的this指向
但是他的参数必须是数组(伪数组)
他的主要应用可以借助内置对象求最大值
var arr = [1,33,99]
Math.max.apply(null,arr)
3.bind方法
bind方法不会调用函数,但是能改变函数内部this指向的问题
返回的是原函数改变this之后产生的函数
浅拷贝和深拷贝
浅拷贝只是拷贝一层,更深层级的对象只拷贝 引用
深拷贝拷贝多层,每一级数据都会拷贝
使用 for in
浅拷贝的语法糖es6中的 (浅拷贝是拷贝地址)
object.assign() 里面第一个参数是拷贝给谁,第二个是拷贝给哪个对象
js中深拷贝
深拷贝是新开辟一个空间 给o