索引

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. Python基础_python的数据类型

    一.Python 的标准数据类型 二.以下单个实际举例分析数据类型 2.1 python的数字类型 Int:整型,Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python ...

  2. Task05:SQL高级处理

    5.1 窗口函数 5.1.1 窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数.OLAP 是OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理. ...

  3. 【NX二次开发】Block UI 双精度表

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  4. Linux 的ftp服务未启用怎么办

    1.检查是否安装ftp相关的rpm包(如出现下面提示证明是安装过相关rpm包的) [root@rac1 ~]# which vsftpd    /usr/sbin/vsftpd    [root@ra ...

  5. DOS命令行(7)——Windows网络检测与诊断

    ping ping 命令的作用是通过发送"网际控制报文协议(ICMP)"回响请求消息来验证另一台TCP/IP计算机的IP级连接状态,回响应答消息的接收情况将和返回过程的次数一起显示 ...

  6. 整合Spring Cloud Stream Binder与RabbitMQ进行消息发送与接收

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 Spring Cloud Stream专门用于事件驱动的微服务系统,使用消息中间件来收发信息.使用Spring ...

  7. jwt-在asp.net core中的使用jwt

    JWT学习文章: 第一篇:JWT原理 第二篇:JWT原理实现代码 第三篇:在asp.net core中的使用JWT 前两篇文章中我写了jwt的原理,并且也用原理实现了jwt的验证.如果要看前两篇文章, ...

  8. 创建Cloudflare CDN

    背景说明: XX全球版项目CDN, 原有改之前:主CDN为Akamai,备CDN为Cloudflare. 计划改之后:主CDN为Cloudflare,备CDN为Akamai. 原因:Akamai CD ...

  9. 浅读tomcat架构设计和tomcat启动过程(1)

    一图甚千言,这张图真的是耽搁我太多时间了: 下面的tomcat架构设计代码分析,和这张图息息相关. 使用maven搭建本次的环境,贴出pom.xml完整内容: <?xml version=&qu ...

  10. c++11 线程间同步---利用std::condition_variable实现

    1.前言 很多时候,我们在写程序的时候,多多少少会遇到下面种需求 一个产品的大致部分流程,由工厂生产,然后放入仓库,最后由销售员提单卖出去这样. 在实际中,仓库的容量的有限的,也就是说,工厂不能一直生 ...