索引

1. 对象与类

支持面向对象编程语言通常利用继承其他类达到代码重用和可扩展性的特性。而类有两个主要的概念:

  • (Class):定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
  • 对象:是类的实例。

其中(Class)定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。举例来说,“”这个类会包含狗的一切基础特征,即所有“狗”都共有的特征或行为,例如它的品种、毛皮颜色和吠叫的能力。类可以为程序提供模版和结构。一个类的方法和属性被称为“成员

​ 需求:通过手机打电话,分析出里面的对象,有什么特征和行为,对象是什么类型的,此时这些的分析结果,--->抽取出对象的特征和行为

特征--->属性

行为--->方法

对象的类型--->类别

2.对象使用

2.1 语法

  1. 对象.属性名字
  2. 对象['属性名字']
  3. 什么时候使用 对象[属性名字] 的写法
    • 不确定属性名字是什么(属性名字是变量)
    • 属性名字不太规范的时候

2.2 属性

枚举属性

  • for...in

    • 该方法依次访问一个对象及其原型链中所有可枚举的属性。

    • var obj = {a:1, b:2, c:3};
      
      for (var prop in obj) {
      console.log("obj." + prop + " = " + obj[prop]);
      } // 打印:
      // "obj.a = 1"
      // "obj.b = 2"
      // "obj.c = 3"
  • Object.keys(对象)

    • 该方法返回对象 o 自身包含(不包括原型中)的所有可枚举属性的名称的数组。

    • // 简单数组
      var arr = ['a', 'b', 'c'];
      console.log(Object.keys(arr)); // console: ['0', '1', '2'] // 类数组对象
      var obj = { 0: 'a', 1: 'b', 2: 'c' };
      console.log(Object.keys(obj)); // console: ['0', '1', '2'] // 类似数组的对象,随机键排序
      var likeObj = { 100: 'a', 2: 'b', 7: 'c' };
      console.log(Object.keys(likeObj)); // console: ['2', '7', '100']
  • Object.getOwnPropertyNames(对象)

    • 该方法返回对象 o 自身包含(不包括原型中)的所有属性(无论是否可枚举)的名称的数组。

3.对象特性


  • 抽象性

  • 拓展性

  • 继承(实现多态)

  • 多态(同一个行为,针对不同的对象产生不同的结果)

    • JavaScript自然有多态,我们看看多态的概念:

      多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

      多态最常见的2种实现方式:

      1. 覆盖
      2. 重载

      覆盖指子类重新定义父类方法,这正好就是基于prototype继承的玩法,这不就是多态么?

      重载是指多个同名但参数不同的方法,这个JavaScript确实没有。

4.对象的创建

4.1 字面量

var obj = {}

4.2 工厂函数

function factoryFn(name,age){
var obj = new Object()
obj.name = name
obj.age = age
return obj
}
//工厂函数批量创建对象,占内存
obj1 = factoryFn("jack",2)
obj2 = factoryFn("Mery",22)

4.3 构造函数

function structorFn(count, password) {
this.count = count;
this.password = password;
this.validate = function() {
console.log('我是验证');
};
};
let obj3 = new structorFn('admin-mater', '123456');
let obj4 = new structorFn('admin-dev', '123456');

4.4 class类

通过 = 赋值的函数在实例上

通过方法是定义在原型上的

class Student {
//构造器中的属性最终都是在实例对象上
constructor(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
} //在构造函数原型上,不能使用this
sayHi(name, age, gender) {
console.dir(`我是${name},今年${age}岁了,是${gender}`);
} //在stu实例上
eat = function() {
console.log(`${this.name}`);
};
//在stu实例上
play = () => {
console.log('模拟人生');
};
} let stu = new Student('红红', '24', 'girl');
stu.__proto__.sayHi('江江', '23', 'boy');
stu.eat();

原型的函数上要传参使用,如果在定义的时候内部是this指向,就会undefined

ex:

4.5 对象与单例模式!!!

创建单例模式对象

关键词:

  • 对象

  • 垃圾回收

  • 闭包

function createObj() {
let judge = null;
return function(name) {
if (!judge) {
judge = new Object();
judge.name = name;
}
return judge;
}
}
console.log(typeof null);//object
let getObj = createObj();//返回访问入口,首次传入的值,会影响之后的所有结果
//访问入口是函数,函数是对象,所以在这里存储了一个地址0x0000 (getObj)
let obj5 = getObj('小绿');//调用时,开辟一个新的judge对象地址 0x0001
//首次调用已经return judge,并且不会被回收!
let obj6 = getObj('辉sir');//传递了第一次的obj5地址0x0001
let obj7 = getObj('辉sir');//传递了第一次的obj5地址0x0001
console.log(obj5);//{name: "小绿"}
console.log(obj6);//{name: "小绿"}
console.log(obj7);//{name: "小绿"}
console.log(obj5 === obj6);//true 引用地址相同,正常情况下Object的打印是false
//抽离核心代码,重新进行函数调用发现并不是唯一入口?
function foo(name) {
let judge = null;
if (!judge) {
judge = new Object();
judge.name = name;
}
return judge;
}; console.log(foo('只') === foo('狼'));//false
//原因是没有形成闭包,返回值被回收了

一次搞懂JavaScript对象的更多相关文章

  1. 来一轮带注释的demo,彻底搞懂javascript中的replace函数

    javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ...

  2. 一张图彻底搞懂JavaScript的==运算

    一张图彻底搞懂JavaScript的==运算 来源 https://zhuanlan.zhihu.com/p/21650547 PS:最后,把图改了一下,仅供娱乐 : ) 大家知道,==是JavaSc ...

  3. 彻底搞懂Javascript的“==”

    本文转载自:@manxisuo的<通过一张简单的图,让你彻底地.永久地搞懂JS的==运算>. 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容让人犯错,从而 ...

  4. 彻底搞懂JavaScript中的继承

    你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...

  5. 一张图带你搞懂Javascript原型链关系

    在某天,我听了一个老师的公开课,一张图搞懂了原型链. 老师花两天时间理解.整理的,他讲了两个小时我们当时就听懂了. 今天我把他整理出来,分享给大家.也让我自己巩固加深一下. 就是这张图: 为了更好的图 ...

  6. 一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别

    总是会被javascript的event对象的clientX,offsetX,screenX,pageX 弄得头晕,于是决定做个图来区分一下(画得我手那个酸呀....) 先总结下区别: event.c ...

  7. 三张图搞懂JavaScript的原型对象与原型链

    对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__proto__混淆,二来它们之间的各种指向实在有些复杂,其实市面上已经有非常多的文章在尝试说清楚,有一张 ...

  8. 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)

    摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...

  9. 一分钟搞懂JavaScript中的JSON对象

    JSON(JavaScript Object Notation)是表示值和对象的通用格式. JavaScript 提供了如下方法: JSON.stringify 将对象转换为 JSON. JSON.p ...

随机推荐

  1. PTA4-6题目集总结与归纳

    前言: 继上篇blog所写的几种日期的求法,这次是把那几种聚合起来,即日期类的聚合设计.除下这类,一种是图形继承设计的3种变化,还有一种是3次对正则表达式的应用.当然,作为一个菜鸟,还是无法写成大佬的 ...

  2. Manacher(马拉车)————O(n)回文子串

    Manacher 一.背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在O(n)的复杂度中返回字符串s中最长回文子串长度的算法,十分巧妙. 让我们举个栗子 ...

  3. Web 动画原则及技巧浅析

    在 Web 动画方面,有一套非常经典的原则 -- Twelve basic principles of animation,也就是关于动画的 12 个基本原则(也称之为迪士尼动画原则),网上对它的解读 ...

  4. Centos8.3、docker部署springboot项目实战记录

    引言    目前k8s很是火热,我也特意买了本书去学习了一下,但是k8s动辄都是成百上千的服务器运维,对只有几台服务器的应用来说使用k8s就有点像大炮打蚊子.只有几台服务器的应用运维使用传统的tomc ...

  5. Centos7搭建内网DNS服务器

      一.配置阿里云yum源 执行脚本配置阿里云的yum源,已配置yum源的可以忽略 #!/bin/bash # ******************************************** ...

  6. 开发小技巧之:unicode的排序和正则匹配

    目录 简介 ASCII字符的排序 本地字符的排序 为什么不使用unicode进行排序 emoji的正则匹配 总结 简介 我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑,最 ...

  7. js 对json数据进行检索 插件 linq.js

    有时界面需要很多数据.但是多次访问服务器效率很低,所以需要检索json数据,最好是像sql查询语句那种 linq.js 插件 LINQ,语言集成查询(Language Integrated Query ...

  8. 不藏了,这些Java反射用法总结都告诉你们

    摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...

  9. sonarqube 8.9版本配置项目访问权限

    soanrqube设置项目权限 admin->项目->要设置的项目 进行项目权限配置 选择权限 权限配置(公开,私有)如果是公司项目建议选择私有 根据项目团队成员的角色需求,进行勾选配置 ...

  10. AcWing 1289. 序列的第k个数

    BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列. 现在给你 整数 序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第k项的值吗. 如果第k项的值太大, ...