Javascript面试题【面向对象】

151 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

  • 面向对象
    • 面向对象的三大特点
  • this
    • this共有几种情况
  • 创建对象
    • JS中创建对象共有几种方式
  • 继承
    • JS中实现继承共有几种方式
  • 深克隆
    • 实现深克隆共有几种方式

面向对象

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

封装

封装就是创建一个对象,集中保存现实中一个事物的属性和功能。

方式1:直接量 {}

var obj = { // new Object() 的简写
  属性名: 属性值,
  方法名: function() {...}
}

对象的大括号只代表 new Object() 的简写,它不代表任何的作用域

  • 在方法内使用obj的属性
var obj = {
  name: "hayes",
  age: 18,
  print: function () {
    console.log(`姓名:${this.name},年龄:${this.age}`)
  }
}
obj.print()

还可以写死:将 this 替换为 obj。但是这样就紧耦合了,不要使用。

  • 什么是 this
    • 每个函数内自带的
    • 专门指向正在调用当前函数的 .前的对象 的关键字
    • this 保存在作用域对象中,一般只有函数才有作用域

在上述代码中调用 print() 函数时,是通过 obj 调用的,所以当前 this 就指向 obj

总结:对象中的方法,要想使用当前对象自己的属性或其他方法时,都要加 this

方式2:new Object()

var 对象名 = new Object(); // 先创建空对象 {}
// 再强行给空对象中添加新属性和新方法
对象名.新属性 = 属性值;
对象名.新方法 = function(){...}
  • js中所有对象底层都是关联数组

方式3:用构造函数

上面两种方式的问题:用 {} 一次只能创建一个对象。如果想创建多个相同结构的对象时,代码就会很多重复!------及其不便于将来的维护。

构造函数:描述同一类型的所有对象的统一结构的函数

为什么使用构造函数:代码复用(复用对象的结构)。

  • 定义构造函数
function 类型名(arg1, arg2, ...){
  // 将来要加入到新对象中的规定的属性
  this.属性名 = arg1;
  this.xxx = xxx;
  this.方法名 = function() {...}
}
  • 使用构造函数反复创建多个结构相同的对象
var 对象名 = new 类型名(实参1, 实参2, ...)

那么 new 一共干了几件事?

  1. 创建指定类型的一个新对象
  2. 同时把实参值传给构造函数的形参变量