面向对象1.7

查面向对象

面向对象复习

面向对象的三大特点:封装 继承 多态/重载

封装:减少代码冗余,提高代码的重复使用率。

继承:子类继承父类的属性。

多态:

现在学习的js是EcmaScript2014(ES5) 生成类靠构造函数,ecmascript2015(es6)用class生成类。

constructor 构造器

  1. 浏览器给每个类(函数)天生赋予一个prototype的属性,这个属性是一个对象,里面有个constructor的属性,叫构造器,指向当前的类本身

console.log(Person.prototype.constructor==Person)//turn
var z=new Person("zhang")

  1. 人为改变类的原型指向(给prototype赋值引用数据类型,基本数据类型不改变),浏览器赋予的constructor属性就不存在了可以人为添加。如果是简单的基本数据类型constructor还存在。
  2. 类在代码中扮演着三种角色,普通函数,普通对象,类
  3. 每个对象天生有一个__proto__的属性,叫原型,他指向父类的原型,obj.__proto__==Person.prototype  true

5.prototype和__proto__都叫原型,前者是函数的属性,后者是对象的属性,前者给程序员使用后者是浏览器用于查找原型的。

This指向

对象继承

  1. 克隆对象不是将一个对象赋值给另一个对象,var obj1=obj2这不是对象克隆,是把obj2的引用地址赋值给obj1.
  2. 通过for in 和Object.create()克隆对象

For in克隆的属性都是私有的,create()得到的属性都是公有的在原型上。

继承

1.7

面向对象

  1. 构造函数里的属性怎么看?看this,谁前面有this谁就是属性

num 不是属性,是私有作用域下的私有变量。

  1. 如何查找面向对象中的this。
  2. 构造函数里的this执行实例对象
  3. 如果是方法中的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 ")(×)

以后我们使用内置方法,出现内置方法报错

  1. 方法名写错。
  2. 内置方法的归属出错。
  3. 原型的批量添加和直接对象添加的区别

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

学习内置对象的方法

  1. 方法的功能
  2. 方法的参数
  3. 方法的返回值
原文地址:https://www.cnblogs.com/mo123/p/10233828.html