Day6 打卡 对象

110 阅读3分钟

Day6 打卡 对象

每日一句

The more dumplings you eat, the more money you make.

饺子吃得越多,钱就赚得越多。

对象的三大特点

  • 封装:创建一个对象,集中保存事物的属性功能
  • 继承:有显(prototype)和隐式(proto)
  • 多态:同一个函数在不同情况下表现出不同的状态

封装对象有3种基本方式

一:字面量形式:(new Object简写) var 对象名 = { 属性名: 值, ..., 方法名: function (){...}, ... }

二:new Object

var 对象名 = new Object();对象名.属性名 = 值;对象名.方法名 = function() {...}

访问成员属性或方法:对象名.属性名/方法名 或 对象名['属性名'/'方法名']

Tips: 对象访问成员的方式有3种,除了上面两种,还有一种通过变量的方式访问

属性是来自一个变量:对象名[变量]

遍历对象成员:

for(var 属性名 in 对象名|数组名) { 
   对象名|数组名[属性名]
}

三:构造函数形式

以上两种形式创建变量只能创建一个对象,如果要创建多个对象则可以用构造函数来创建。

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

为什么使用构造函数?-> 可复用对象的结构

1.定义构造函数

function 函数名(形参1,形参2,...) {
    this.属性名 = 形参1;
    this.xxx = xxx;
    this.方法名 = function () {
      this.属性名
      ...
    }
}

2.使用构造函数反复创建对象

var 对角名 = new 函数名(实参1, 实参2,...);

new 做了4件事

1.创建了一个指定类型的对象
2.让子对象继承构造函数的原型对象
3.调用构造函数
  > 将构造函数中this指定刚创建的对象
  > 在构造函数中强行赋值方式,为新对象添加了规定的属性和方法
4.返回对象的地址

Tips:构造函数中不要包含方法定义的,浪费内存,需要将方法放到原型中,让子对象可共用

对象原型的this指向

不看定义,谁调用就指谁

小结:

obj.fun(); // this==>obj
new Fun(); // this==>指向创建的新对象
原型对象中共有方法this, 要看将来调用些方法.前的对象

内置类型的原型对象

内置类型有几种?

内置类型有12种

  • String,Number,Boolean
  • Array,Date,RegExp
  • Math(严格来说不是类型,是一个{}对象)
  • Error
  • Function,Object
  • global(全局对象,浏览器中指Window,严格来说不是类型)
  • Symbool(ES6)

类型是有2部分组成:

构造函数
原型对象

prototype

可通过prototype来查看,如Array.prototype, String.portotype, Date.prototype,...

如果原型对象中没有,则可以自定义

构造函数.prototype.方法名 = function() {
...
}

原型链

原型链:由多级父对象逐级继承形成的链式结构。

保存着一个对象可用的所有属性和方法
控制着属性和方法的使用顺序:就近原则(先子后父)

所有对象的toString结果不一样

({}).toString(); // '[object Object]'
[1,2,3].toString(); // '1,2,3'
Date.now().toString(); // '1643096515711'

以上就体现了多态。

多态包括2种

重载overload: 同一个函数,输入不同参数,执行不同逻辑。
重写override:子对象中重写一个父对象中重名的函数。

总结

谈谈你对面向对象的理解?

哈哈这也太宽泛了吧,这说啥好呢!!!

三大特点:封装,继承,多态
封装:创建对象有2种:只创建一个对象:{}, 创建多个相同结构对象就用构造函数
继承:多个子对象都拥有相同的属生或方法,就要放在构造函数的原型中
多态:只要觉得父对象中的成员不好用,可在子对象中重写其同名成员