一次搞懂JavaScript对象
索引
1. 对象与类
支持面向对象编程语言通常利用继承其他类达到代码重用和可扩展性的特性。而类有两个主要的概念:
其中类(Class)定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。举例来说,“狗”这个类会包含狗的一切基础特征,即所有“狗”都共有的特征或行为,例如它的品种、毛皮颜色和吠叫的能力。类可以为程序提供模版和结构。一个类的方法和属性被称为“成员”
需求:通过手机打电话,分析出里面的对象,有什么特征和行为,对象是什么类型的,此时这些的分析结果,--->抽取出对象的特征和行为
特征--->属性
行为--->方法
对象的类型--->类别
2.对象使用
2.1 语法
对象.属性名字
对象['属性名字']
- 什么时候使用
对象[属性名字]
的写法- 不确定属性名字是什么(属性名字是变量)
- 属性名字不太规范的时候
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种实现方式:
- 覆盖
- 重载
覆盖指子类重新定义父类方法,这正好就是基于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对象的更多相关文章
- 来一轮带注释的demo,彻底搞懂javascript中的replace函数
javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ...
- 一张图彻底搞懂JavaScript的==运算
一张图彻底搞懂JavaScript的==运算 来源 https://zhuanlan.zhihu.com/p/21650547 PS:最后,把图改了一下,仅供娱乐 : ) 大家知道,==是JavaSc ...
- 彻底搞懂Javascript的“==”
本文转载自:@manxisuo的<通过一张简单的图,让你彻底地.永久地搞懂JS的==运算>. 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容让人犯错,从而 ...
- 彻底搞懂JavaScript中的继承
你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...
- 一张图带你搞懂Javascript原型链关系
在某天,我听了一个老师的公开课,一张图搞懂了原型链. 老师花两天时间理解.整理的,他讲了两个小时我们当时就听懂了. 今天我把他整理出来,分享给大家.也让我自己巩固加深一下. 就是这张图: 为了更好的图 ...
- 一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别
总是会被javascript的event对象的clientX,offsetX,screenX,pageX 弄得头晕,于是决定做个图来区分一下(画得我手那个酸呀....) 先总结下区别: event.c ...
- 三张图搞懂JavaScript的原型对象与原型链
对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__proto__混淆,二来它们之间的各种指向实在有些复杂,其实市面上已经有非常多的文章在尝试说清楚,有一张 ...
- 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)
摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...
- 一分钟搞懂JavaScript中的JSON对象
JSON(JavaScript Object Notation)是表示值和对象的通用格式. JavaScript 提供了如下方法: JSON.stringify 将对象转换为 JSON. JSON.p ...
随机推荐
- Python 5种方法实现单例模式
基本介绍 一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点. 单例模式应该是应用最广泛,实现最简单的一种创建型模式. 特点:全局唯一,允许更改 优缺点 优点: 避免对资源的多重 ...
- 最短路径问题,BFS,408方向,思路与实现分析
最短路径问题,BFS,408方向,思路与实现分析 继上回挖下的坑,不知道大家有没有认真看最小生成树呢?很简单,这回也讲讲正常难度的,看不懂就来这里看看,讲的很好~~ 最短路径问题 说起这个问题,先说个 ...
- jmeter--JSON Extractor 用法
JMeter处理大部分请求返回的结果,都是json.对于请求返回的结果,处理以后作为其他请求的参数,有一个方便使用的插件:JSON Extractor JSON Extractor中文叫做json提取 ...
- WordPress安装篇(5):源码编译安装LNMP并部署WordPress
与YUM方式安装相比,源码编译安装方式更灵活,安装过程中能自定义功能和参数,特别是在批量部署服务器又要求软件版本及配置一致时,源码编译安装的优势很明显.本文介绍如何通过源码编译方式安装Nginx1.1 ...
- 【NX二次开发】获取对象边界包容盒的三个函数UF_MODL_ask_bounding_box
今天看到胡工对bounding_box的分享,我也来测试一番(原帖地址:https://www.ugapi.com/thread-10287.html) 获取对象的边界盒子的三个函数: 1 UF_MO ...
- Docker 版 3分钟部署 .net core 开源在线客服系统,他来了
我在博客园发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 前些天又应朋友的要求,发了一篇 CentOS 版本的安装部署教程:https://www.cnblogs.com ...
- css基本内容笔记(学习整理)
一.css简介 1.什么是css 层叠样式表. 层叠:层层叠加,若果有冲突应用优先级高,不冲突的部分共同作用 样式表:就是css属性样式的集合: 2.作用 a.修饰html,使得html样式更好看 b ...
- C#winform的Richtextbox控件实现自动滚动到最后一行功能
这里有两种情况 如果是采用的是richtextbox的AppendText的方法添加的内容,则只需 设置HideSelection为false 如果采用的是其他添加内容的方法,则需要添加TextCha ...
- Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应
在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...
- 复习Spring第三课--数据源配置的多种方式
spring数据源配置可以说分为:spring容器自带连接池.项目中创建连接池.服务器创建连接池三种 一.spring容器自带连接池 Spring本身也提供了一个简单的数据源实现类DriverMa ...