面向对象:
1.构造函数里的属性怎么看?
谁前面有this谁就是属性
案例:
function Person(name,age){
var num=12; //他不是a的属性,只是私有作用域的私有变量
this.name=name;
this.age=age;
}
var a=new Person("张三",20)
console.log(a)
2.如何查找面向对象中的this;
1.构造函数里的this指向他的实例对象
2.如果是方法中的this (要分三个步骤,依次执行)
(找到this) 步骤一:在调用的时候,看方法前面的.(点) this就指向谁;
(替换this) 步骤二:将this换成你找到的那个结果
(精确查找) 步骤三:用原型链查找模式及分析
案例:
function Person(){
this.x=12;
this.y=30;
this.gets=function(){
return this.x //this不一定指向他的实例对象跟他的调用有关
}
}
Person.prototype.sun=function(){
return this.x //第二步在这里翻译为(return a.__proto__.x)
}
var a=new Person;
console.log(a.__proto__.gets()) (解析(按照步骤来一波):方法调用时,指向.前面的。及this指向为a.__proto__,第二步,将this换成a.__proto__,第三步利用原型链查找及分析:
this.x=>a.__proto__.x=>Person.prototype.x=>Person.prototype.x 得出结论:原型上没有这个方法 结果为:undefined不是一个函数)
3.关于构造函数的返回值问题
构造函数也是函数,每个函数都有返回值,构造函数返回的是this
4.数组的方法
1.push() unshift() pop() shift()
学习内置对象的方法(窍门):
1.方法的功能
2.方法的参数
3.方法的返回值
链式写法:
案例:
var arr=[12,45,36]
var s=[89]
console.log(arr.splice(1).concat(s).reverse())
上面的这种可以通过.实现的多个方法,我们把它叫做链式写法;
实现原理:每个方法使用完毕之后,不仅可以得到想要的结果,还需要把当前实例对象返回,才可以实现链式写法
对象分析:以后我们在使用内置方法,出现内置方法报错;
基本上会有两种情况(1.方法名写错;2.内置方法的归属出错)
元素的父级
div#div<HTMLDivElement<HTMLElement<Element<Node<EventTarget<Object
获取的元素是document的属性;
document.getElementsByName() 这个方法;
<p name="p"></p>
var a=document.getElementsByName("p")
5.原型的批量添加和直接对象添加的区别
案例:
function Person(){
this.name="张三"
}
Person.prototype.age=45; //原型批量添加
Person.prototype={ //直接对象添加
age:56
}
如果是批量添加属性,没有改变原型的内存地址(浏览器开辟的)
如果是以对象形式添加,就会更改原型的内存地址,浏览器开辟的就被销毁了
6.怎样给内置对象添加方法;
如果给内值类的的原型添加方法,使用对象形式Array.prototype={sun:function(){}}不起作用,因为浏览器会保护内置对象的原型内存地址不让人为修改,只能使用批量的形式添加方法Array.prototype.sun=function(){}
7.拷贝的几种方式
1.var obj={}
var obj2=obj 这种写法可以算是拷贝中的一种,但是严格意义上讲,只是将内存地址赋值给了obj2
2.浅拷贝:就是将一个对象的属性一个一个复制到了另一个对象中去(主要针对第一层)
案例:
var obj={
name:"张三",
age:20
}
var obj2={}
for(var key in obj){
obj2[key]=obj[key]
}
console.log(obj2);
3.深拷贝:如果对象中的属性值又是一个引用数据类型,浅拷贝也能实现,浅拷贝还是把引用数据类型的内存地址赋值给空的对象的一个属性,深拷贝将属性值也一个一个遍历赋值;
案例:
var obj={
name:"张三",
arr=[12,20,36]
sex:{
y:12,
x:24
}
}
var obj2={}
function extend(oldobj,newobj){
for(var key in oldobj){
var item=oldobj[key] //遍历每个属性的属性值
if(item instanceof Array){
newobj[key]=[]
extend(item,newobj[key])
}
else if(item instanceof Object){
new[key]={}
extend(item,newobj[key])
}
else{
newobj[key]=item
}
}
extend(obj,obj2)