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上篇·第三章·对象的更多相关文章

  1. 你不知道的JavasScript上篇·第四章·混合对象·类

    一.类的理论 1.类的核心概念:多态 是说父类的通用行为可以被子类用更特殊的行为重写 二.类的机制 1.构造函数 类实例是有一个特殊的类方法构造的,这个方法名通常和类名一致: 类构造函数属于类,构造函 ...

  2. 你不知道的JavasScript上篇·第五章·原型·上

    1.[[Prototype]] JS中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用.几乎所有的对象在创建时这个属性都被赋予一个非空的值 (proto) var my ...

  3. 你不知道的JavasScript上篇·第五章·原型·下

    5.差异继承 继承意味着复制操作: 差异继承: 基本原则是在描述对象行为时,使用其不同于普遍描述的特制. (我的理解是只用对象自身的而不用普遍继承的像是toString(),valueOf()这种方法 ...

  4. c#高级编程第七版 学习笔记 第三章 对象和类型

    第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 ...

  5. javascript面向对象精要第三章对象整理精要

    什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...

  6. 《Java并发编程实战》第三章 对象的共享 读书笔记

    一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...

  7. java并发编程实战:第三章----对象的共享

    我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它:我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化. 一.可见性 重排序:在没有同步的情况下,编译器.处理器可能对代码的执行顺 ...

  8. 【读书笔记】C#高级编程 第三章 对象和类型

    (一)类和结构 类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类和结构的区别:内存中的存储方式.访问方式(类是存储在堆上的引用类型,结构是存储在栈的值类型)和它 ...

  9. 第三章 对象(JavaScript:语言精粹)

      对象是属性的容器,其中每个属性都有名字和值.   3.0. 概览:对象字面量 | 检索 | 更新 | 引用 | 原型 | 反射 | 枚举 | 删除 | 减少全局变量污染   3.1. 对象字面量 ...

随机推荐

  1. Spring学习笔记3——消息队列(rabbitmq), 发送邮件

    本节的内容是用户注册时,将邮箱地址先存入rabbitmq队列,之后返回给用户注册成功:之后消息队列的接收者从队列中获取消息,发送邮件给用户. 一.RabbitMQ介绍     如果之前对rabbitm ...

  2. TmsTimeUtils 时间戳

    package com.sprucetec.tms.utils; import java.math.BigDecimal;import java.text.DateFormat;import java ...

  3. 为什么要先 git add 才能 git commit

    1. git 的 add ,是一个容易引起疑问的命令.在 subversion 中的 svn add 动作是将某个文件加入版本控制,而 git add的意义完全不同. 同时, git diff --c ...

  4. Postgres 的 Range 类型

    mysql 不支持 Range 类型 零.介绍 1. 适用场景: a.可以用于实现 是否满足薪资需求 的功能 b.可以用于实现 是否符合上线时间 的功能 一.定义 1.类型范围 Postgres Se ...

  5. eclipse上搭建mybatis

    1..在help中打开 2.搜索mybatipse 3:功能简介 1:要查找某一个方法        在dao接口中某一个方法中 按住 Ctrl键 鼠标指到方法名称上 选择open xml 就会自动跳 ...

  6. Docker - Docker与Vagrant的区别

    Docker Docker - HomePage Wiki - Docker Docker简介 Overview Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协 ...

  7. [LeetCode] 反转整数

    题目: 给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注 ...

  8. asp.net core 系列之用户认证(1)-给项目添加 Identity

    对于没有包含认证(authentication),的项目,你可以使用基架(scaffolder)把 Identity的程序集包加入到项目中,并且选择性的添加Identity的代码进行生成. 虽然基架已 ...

  9. odoo开发 相关知识点

    (1)导入模块可以起别名: (2) 新的模型前端要调用显示有关联的另一个模型的相关字段 (3) 传递上下文 搜索视图打开默认按照接收的参数搜索显示: 发起端视图 上下文写法: 目标端 触发显示,搜索视 ...

  10. 封装、构造方法、private、Static与this关键字、main()_Day07

    1:成员变量和局部变量的区别(理解) (1)定义位置区别:      成员变量:定义在类中,方法外.    局部变量:定义在方法中,或者方法声明上.    (2)初始化值的区别:   成员变量:都有默 ...