索引

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+selenium基础篇,弹窗处理

    1.弹窗如下图所示 2.处理方法 from selenium.webdriver.common.action_chains import ActionChains#导入鼠标操作包 from selen ...

  2. Padavan安装使用ZeroTier实现组建虚拟局域网的方法

    首先到这个网站ZeroTier – Global Area Networking注册登陆,注册及创建网络的过程可以参考网上及其他UP主的教程,我就不重复了. 本篇主要讲述的是hiboy大佬编译的固件在 ...

  3. 【NX二次开发】获取边的类型 UF_MODL_ask_edge_type

    源码 extern DllExport void ufsta(char *param, int *returnCode, int rlen) { UF_initialize(); int edge_t ...

  4. MySQL:数据库优化,看这篇就够了

    数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷. 1. 优化一览 ...

  5. 你应该这样去开发接口:Java多线程并行计算

    所谓的高并发除了在架构上的高屋建瓴,还得需要开发人员在具体业务开发中注重自己的每一行代码.每一个细节,面子有的同时,更重要的还是要有里子. 面对性能,我们一定要有自己的工匠精神,不可以对任何一行代码妥 ...

  6. 关于kubernetes的十七个实验(一)

    实验综述 Kubernetes用来管理云平台上的容器化应用,这里从 https://www.katacoda.com/courses/kubernetes 学习Kubernetes的使用,对Kuber ...

  7. VBS脚本编程(3)——常用函数

    数据类型转换函数 1.Hex 函数 返回表示十六进制数字值的字符串. Hex(number) number 参数是任意有效的表达式. 说明 如果 number 参数不是整数,则在进行运算前将其四舍五入 ...

  8. 4.2 万 Star!开发 Web 和移动端应用的全栈平台

    [导语]:Meteor 是一个用 JS 开发现代 Web 应用程序的平台.它是开源的,在 GitHub 上有 4.2 万 Star. Meteor 是什么? 官方文档是这样描述 Meteor 的:Me ...

  9. 『心善渊』Selenium3.0基础 — 9、使用Seleniun中的By类定位元素

    目录 1.使用By定位的前提 2.By定位的方法 3.By定位的使用 4.复数形式的示例 我们还可以通过Seleniun测试框架中的By类,来实现页面中的元素定位. 1.使用By定位的前提 需要导入B ...

  10. SpringCloud Alibaba实战(11:引入服务网关Gateway)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 在前面的章节中,我们已经完成了服务间的调用.统一配置等等,在这 ...