你不知道的JavasScript上篇·第三章·对象
1、Object.defineProperty()&&getter、setter
- Object.defineProperty(目标对象,属性名(string型),{
get:function(){
//给新增属性设置一个getter
},
enumerable:true//设置为可枚举属性,保证b可以出现在对象的属性列表中
})
var myObject = {
get a(){
return this._a_;
},
set a(val){
this._a_ = val
}
}
Object.defineProperty(myObject,"b",{
get:function(){
//注意这里必须写成get属性的形式,不然不会执行的
return this.a*2
},
enumerable:true
})
myObject.a = 2;//2
myObject.b;//4
2、存在性
- 判断对象中是否存在某个属性, in & hasOwnProperty()
var myObject ={
a:'a'
}
("a" in myObject);//true (表达式)在js中会立即执行
("b" in myObject);//false
myObject.hasOwnProperty('a');//true
myObjec.hasOwnProperty('b');//false
- "属性名" in 目标对象:这种方式判断的属性名是否存在,既查找目标对象本身也查找原型链
- 目标对象.hasOwnProperty("属性名"):这种方式只会判断属性是否在目标对象上,不会查找原型链 ,但是这种方式如果我们手动的在对象上添加了hasOwnproperty方法,返回值会变得不准确
因此可以采用更加强硬的方法判断:
Object.prototype.hasOwnproperty.call(目标对象,"a");//判断目标对象上是否有属性名为a的属性
3、枚举
enumerable:可枚举性,保证属性是可以在for...in循环中出现
var myObject = {};
Object.defineProperty(myObject,'a',{
value:'2',
enumerable:true
})
Object.defineProperty(myObject,'b',{
value:'b',
enumberable:false
})
console.log('b' in myObject);//true
console.log(Object.prototype.hasOwnProperty.call(myObject,'b');//true
for(key in myObject){
console.log(key);//最终只出现a
}
判断是否枚举及是否目标对象直接包含指定属性
目标对象.propertyIsEnumerable("属性名");//属性是否直属于目标对象且enumerable属性值为true
Object.keys(目标对象);//返回所有直属于目标对象并且可枚举的属性数组['a']
Object.getOwnPropertyNames(目标对象);//返回所有直属于目标对象的属性无论是否可枚举
4、遍历
数组中遍历:
forEach(...)遍历数组中所有值并忽略回调函数的返回值
every(...)会一直运行直到回调函数返回false
some(...) 会一直运行知道回调函数返回true
for(...of...) 循环遍历数组项的值
var myArray = [1,2,3]
myArray.forEach(function(item,index,array){
console.log(`forEach结果:item:${item},index:${index},array:${array}`)
})
myArray.every(function(item,index,array){
console.log(`every:item:${item},index:${index},array:${array}`)
return item>3
})
myArray.some(function(item,index,array){
console.log(`some结果:item:${item},index:${index},array:${array}`);
return item >3
})
总结:
字面量创建对象:var a = {...}
构造函数创建对象:var a = new Array();
JS中对象类型有6中基本类型:string、boolean、number、null、undefined、object
内置对象:String、Number、Boolean、Object、Function、Array、Date、RegExp、Error
复制对象:
深拷贝:JSON.parse(JSON.stringify(someObj))
浅拷贝:Es6中新增的Object.assign(...) 只拷贝对象自身的属性不拷贝继承的
属性描述符:
writable:读写属性
enumerable:可枚举
configurable:可配置,一旦设置属性值不能再次通过Object.defineProperty()更改
不变性:
1.属性常量:设置writable:fale&configurable:false就可以创建一个不可修改重定义或删除的常量属性
2、禁止扩展:禁止一个对象添加新属性并且保留原属性使用Object.preventExtensions(...)
var myObject ={
a:'a'
}
Object.preventExtensions(myObject);
myObject.b = 'b';
myObject.b;//undefined,严格模式下会报错TypeError
你不知道的JavasScript上篇·第三章·对象的更多相关文章
- 你不知道的JavasScript上篇·第四章·混合对象·类
一.类的理论 1.类的核心概念:多态 是说父类的通用行为可以被子类用更特殊的行为重写 二.类的机制 1.构造函数 类实例是有一个特殊的类方法构造的,这个方法名通常和类名一致: 类构造函数属于类,构造函 ...
- 你不知道的JavasScript上篇·第五章·原型·上
1.[[Prototype]] JS中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用.几乎所有的对象在创建时这个属性都被赋予一个非空的值 (proto) var my ...
- 你不知道的JavasScript上篇·第五章·原型·下
5.差异继承 继承意味着复制操作: 差异继承: 基本原则是在描述对象行为时,使用其不同于普遍描述的特制. (我的理解是只用对象自身的而不用普遍继承的像是toString(),valueOf()这种方法 ...
- c#高级编程第七版 学习笔记 第三章 对象和类型
第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 ...
- javascript面向对象精要第三章对象整理精要
什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...
- 《Java并发编程实战》第三章 对象的共享 读书笔记
一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...
- java并发编程实战:第三章----对象的共享
我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它:我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化. 一.可见性 重排序:在没有同步的情况下,编译器.处理器可能对代码的执行顺 ...
- 【读书笔记】C#高级编程 第三章 对象和类型
(一)类和结构 类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类和结构的区别:内存中的存储方式.访问方式(类是存储在堆上的引用类型,结构是存储在栈的值类型)和它 ...
- 第三章 对象(JavaScript:语言精粹)
对象是属性的容器,其中每个属性都有名字和值. 3.0. 概览:对象字面量 | 检索 | 更新 | 引用 | 原型 | 反射 | 枚举 | 删除 | 减少全局变量污染 3.1. 对象字面量 ...
随机推荐
- 彻底弄懂“PKIX path building failed”问题
SSL的基础知识 SSL的全称是Secure Socket Layer.它的通信流程如下图所示,客户端与服务端会通过几次通信,通过非对称加密创建出一个加密密钥,用于以后的对称信息加密. 1,客户端明文 ...
- Python之tkinter中的askyescancel窗口返回值
if messagebox.askokcancel(title="确认取消",message="您确认注册该账号吗?"): messagebox.showinf ...
- Eclipse个人规范化设置
为保证在各个在各个系统中获得的代码样式保持一致,规范法化开发,对Eclipse进行一些常用通用设置: 1. 代码块缩进 4个空格,如果使用 tab缩进,请设置成 1个 tab为 4个空格.(阿里巴巴开 ...
- C# 多线程六之Task(任务)三之任务工厂
1.知识回顾,简要概述 前面两篇关于Task的随笔,C# 多线程五之Task(任务)一 和 C# 多线程六之Task(任务)二,介绍了关于Task的一些基本的用法,以及一些使用的要点,如果都看懂了,本 ...
- FactoryMethod工厂方法模式(创建型模式)
1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...
- Redis随笔(五)Jedis、jedisCluster的使用
1.Jedis客户端 https://redis.io/clients 2.Jedis源码包与使用介绍 https://github.com/xetorthio/jedis 3.项目中使用 通过mav ...
- CFileDialog类的详情
CFileDialog类封装了Windows常用的文件对话框. 常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能. void CnotepadDlg::OnOp ...
- 配置codis-proxy
在整个的处理过程之中,虽然利用codis可以帮助我们动态实现主从的配置,但是从实际来讲用户不可能直接去操作redis客户端,必须通过codis-proxy来代理,所以需要针对于codis-proxy进 ...
- docker-dockerfile使用
使用 centos基础镜像, 构建dockerfile-ngix 简单说, 就是把需要做的东西写下来, 然后build的时候, 自动运行 一般包含: 基础镜像信息 维护者信息 镜像操作指令 容器启动 ...
- Java队列——Disruptor 的使用
.什么是 Disruptor 从功能上来看,Disruptor 是实现了“队列”的功能,而且是一个有界队列.那么它的应用场景自然就是“生产者-消费者”模型的应用场合了. 可以拿 JDK 的 Bloc ...