查面向对象
面向对象复习
面向对象的三大特点:封装 继承 多态/重载
封装:减少代码冗余,提高代码的重复使用率。
继承:子类继承父类的属性。
多态:
现在学习的js是EcmaScript2014(ES5) 生成类靠构造函数,ecmascript2015(es6)用class生成类。
constructor 构造器
- 浏览器给每个类(函数)天生赋予一个prototype的属性,这个属性是一个对象,里面有个constructor的属性,叫构造器,指向当前的类本身
console.log(Person.prototype.constructor==Person)//turn
var z=new Person("zhang")
- 人为改变类的原型指向(给prototype赋值引用数据类型,基本数据类型不改变),浏览器赋予的constructor属性就不存在了可以人为添加。如果是简单的基本数据类型constructor还存在。
- 类在代码中扮演着三种角色,普通函数,普通对象,类
- 每个对象天生有一个__proto__的属性,叫原型,他指向父类的原型,obj.__proto__==Person.prototype true
5.prototype和__proto__都叫原型,前者是函数的属性,后者是对象的属性,前者给程序员使用后者是浏览器用于查找原型的。
This指向
对象继承
- 克隆对象不是将一个对象赋值给另一个对象,var obj1=obj2这不是对象克隆,是把obj2的引用地址赋值给obj1.
- 通过for in 和Object.create()克隆对象
For in克隆的属性都是私有的,create()得到的属性都是公有的在原型上。
继承
1.7
面向对象
- 构造函数里的属性怎么看?看this,谁前面有this谁就是属性
num 不是属性,是私有作用域下的私有变量。
- 如何查找面向对象中的this。
- 构造函数里的this执行实例对象
- 如果是方法中的this
(1) 找到this 在调用方法时看方法前面的“.”是谁,this就是谁
(2) 替换this 将this换成你找到的那个结果
(3) 精确查找 用原型链查找模式去分析
3.关于构造函数的返回值问题
构造函数也是函数,每个函数都有返回值,构造函数返回的是this。
function Person(name,age){
var num=12;
this.name=name;
this.age=age
}
上面的这种可以通过.来实现的多个方法 我们把他叫做链式写法。
实现原理:每个方法使用完毕之后,不仅可以得到想要的结果,还需要把当前实例对象返回,才可以实现链式写法。
4.对象分析
console.log(arr.splice(1).concat(s).reverse())
var div=document.getElementById("div ")(×)
以后我们使用内置方法,出现内置方法报错
- 方法名写错。
- 内置方法的归属出错。
- 原型的批量添加和直接对象添加的区别
function Person(){
this.name="该打"
}
Person.prototype.age=45;
Person.prototype={
sex:56
}
如果是批量添加属性,没有改变原型的内存地址(浏览器开辟的)
如果是以对象形式添加,就会更改原型的内存地址,浏览器开辟的就被销毁了。
Person.prototype={
sex:56
}
var zhang=new Person;
var chen=new Person;
console.log(chen.age)
6.怎样给内置对象添加方法
如果给内置类的原型添加方法,使用对象形式添加,不起作用。
Array.prototype={sun:function...} xxx 错的 浏览器会保护内置对象的原型内存地址,不让人为修改,只能使用批量的形式添加方法
Array.prototype.sun=function...
腾讯18年春招面试题
function Person(name){
this.name=name
}
Person.prototype.age=20;
Person.prototype.aword=[];
var jk=new Person("jk")
var rs=new Person("rs")
jk.age++;
console.log(jk)
rs.aword.push("oo")
console.log(jk)
console.log(rs)
console.log(jk.aword)
Jk.age++ 等价于 jk.age=jk.age+1 先通过jk.age查找私有的age属性,没有,再找公有的age属性,有是20,然后加1为21.再赋值给jk的私有属性age。
Rs.aword.push(“oo”) 先rs查找私有的aword属性,没有,在查找公有的aword属性,有,结果是数组,引用数据类型,又会开辟一个内存地址,存放数组,将内存地址赋值给aword,然后去给这个地址中的aword添加了一个oo的元素。Jk.aword查找私有的,没有,再查找公有的,有,但是aword是内存地址,再向这个内存地址去查看这个数组,rs和jk查找的aword都是同一个内存地址的数组,所以一改则全改。
复习数组的方法
1.pop push shift unshift split
学习内置对象的方法
- 方法的功能
- 方法的参数
- 方法的返回值