JS面向对象——Object.defineProperty

一、JavaScript的面向对象

JavaScript其实支持多种编程范式的,包括函数式编程和面向对象编程:

  • JavaScript中的对象被设计成一组属性的无序集合,像是一个哈希表,有key和value组成;
  • key是一个标识符名称,value可以是任意类型,也可以是其他对象或者函数类型;
  • 如果值是一个函数,那么我们可以称之为是对象的方法;

如何创建一个对象呢?
早期使用创建对象的方式最多的是使用Object类,并且使用new关键字来创建一个对象

  • 这是因为早期很多JavaScript开发者是从Java过来的,它们也更习惯于Java中通过new的方式创建一个对象;
    在这里插入图片描述

后来很多开发者为了方便起见,都是直接通过字面量的形式来创建对象

  • 这种形式看起来更加的简洁,并且对象和属性之间的内聚性也更强,所以这种方式后来就流行了起来;
    在这里插入图片描述

二、对属性操作的控制

在前面我们的属性都是直接定义在对象内部,或者直接添加到对象内部的:
在这里插入图片描述

  • 但是这样来做的时候我们就不能对这个属性进行一些限制:比如这个属性是否是可以通过delete删除呢?这个属性是否在for-in遍历的时候被遍历出来呢?

如果我们想要对一个属性进行比较精准的操作控制,那么我们就可以使用属性描述符。

  • 通过属性描述符可以精准的添加或修改对象的属性;
  • 属性描述符需要使用 Object.defineProperty 来对属性进行添加或者修改;

三、Object.defineProperty

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
在这里插入图片描述
可接收三个参数:

  • obj要定义属性的对象;
  • prop要定义或修改的属性的名称或 Symbol;
  • descriptor要定义或修改的属性描述符;

返回值:

  • 被传递给函数的对象。

四、属性描述符分类

属性描述符的类型有两种:

  • 数据属性(Data Properties)描述符(Descriptor);
  • 存取属性(Accessor访问器 Properties)描述符(Descriptor);

在这里插入图片描述

五、数据属性描述符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、存取属性描述符

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

var obj = {name: 'zep',age: 18,_address: '北京市'
}// 数据属性描述符
Object.defineProperty(obj, 'address', {enumerable: true,configurable: true,value: '深圳市',writable: true
})// 存取属性描述符
Object.defineProperty(obj, 'address', {enumerable: true,configurable: true,get: function () {return this._address},set: function (value) {this._address = value}
})
console.log(obj)
obj.address = '深圳市'
console.log(obj)

七、同时定义多个属性

Object.defineProperties() 方法直接在一个对象上定义 多个 新的属性或修改现有属性,并且返回该对象。
在这里插入图片描述
在这里插入图片描述

八、对象方法补充

获取对象的属性描述符:

  • getOwnPropertyDescriptor
  • getOwnPropertyDescriptors
    在这里插入图片描述

禁止对象扩展新属性:preventExtensions

  • 给一个对象添加新的属性会失败(在严格模式下会报错);
    在这里插入图片描述

密封对象,不允许配置和删除属性:seal

  • 实际是调用preventExtensions
  • 并且将现有属性的configurable:false
    在这里插入图片描述
    在这里插入图片描述

冻结对象,不允许修改现有属性: freeze

  • 实际上是调用seal
  • 并且将现有属性的writable: false
    在这里插入图片描述
var obj = {name: 'zep',age: 18
}
// 禁止对象继续添加新的属性
/*Object.preventExtensions(obj)obj.height = 1.88
obj.address = '深圳市'
console.log(obj)*/
// 禁止对象配置/删除里面的属性
/*for (var key in obj) {Object.defineProperty(obj, key, {configurable: false,enumerable: true,writable: true,value: obj[key]})
}*/
/*Object.seal(obj)
delete obj.name
delete obj.age
console.log(obj)*/
// 让属性不可以修改(writable: false)
Object.freeze(obj)
obj.name = 'haha'
console.log(obj.name)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

json字符串和字典类型的相互转换(转载)

转自:http://www.cnblogs.com/YUTOUYUWEI/p/5585863.html 在开发过程中,有时候需要将json字符串转为字典类型,反之亦然,通常采用.Net的开源类库Newtonsoft.Json进行序列化,这里我也是采用这个,不过我更喜欢…

JS高级——对象的原型__proto__、函数的原型prototype、构造函数

一、认识构造函数 我们先理解什么是构造函数? 构造函数也称之为构造器(constructor),通常是我们在创建对象时会调用的函数;在其他面向的编程语言里面,构造函数是存在于类中的一个方法,称之为构造…

JS面向对象——原型链、通过原型链实现继承、借用构造函数实现继承

一、JavaScript原型链 在真正实现继承之前,我们先来理解一个非常重要的概念:原型链。 我们知道,从一个对象上获取属性,如果在当前对象中没有获取到就会去它的原型(__proto__)上面获取: 二、…

JS面向对象——原型式继承函数、寄生式继承函数、寄生组合式继承

一、原型式继承函数 回顾一下JavaScript想实现继承的目的:重复利用另外一个对象的属性和方法. 最终的目的:student对象的原型指向了person对象; 二、寄生式继承函数 寄生式(Parasitic)继承是与原型式继承紧密相关的一种思想, 并且同样由道格…

JS面向对象——Object对象的方法补充、原型继承关系图

一、Object.create() 这个方法用于创建一个新对象。被创建的对象的__proto__指向create函数第一个参数的原型对象prototype,在创建新对象时可以通过create函数第二个参数指定一些属性。 二、Object.hasOwnProperty() 对象是否有某一个属于自己的属性&#xff08…

JS面向对象——class定义类、类的构造函数、实例方法、访问器方法、静态方法、继承、super、多态

一、认识class定义类 我们会发现,按照前面的构造函数形式创建 类,不仅仅和编写普通的函数过于相似,而且代码并不容易理解。 在ES6(ECMAScript2015)新的标准中使用了class关键字来直接定义类;但是类本质上依…

ES6(一)——字面量的增强、解构、let/const、块级作用域、暂时性死区

一、字面量的增强 ES6中对 对象字面量 进行了增强,称之为 Enhanced object literals(增强对象字面量)。 字面量的增强主要包括下面几部分: 属性的简写:Property Shorthand方法的简写:Method Shorthand计算…

MapReduce算法形式四:mapjoin

案例四:mapjoin(对个map共同输入,一个reduce) 这个方法主要解决的是,几个表之间的比较,类似于数据库的内外连接,还有一些左右连接之类的,简而言之就是,A表没有的B表有&am…

ES6(二)——字符串模板、标签模板字符串、函数的默认参数、剩余参数、数组对象的展开语法、数值的表示、Symbol

一、字符串模板基本使用 在ES6之前,如果我们想要将字符串和一些动态的变量(标识符)拼接到一起,是非常麻烦和丑陋的(ugly)。 ES6允许我们使用字符串模板来嵌入JS的变量或者表达式来进行拼接: 首…

ES6(三)——Set、WeakSet、Map、WeakMap

一、Set的基本使用 在ES6之前,我们存储数据的结构主要有两种:数组、对象。 在ES6中新增了另外两种数据结构:Set、Map,以及它们的另外形式WeakSet、WeakMap。 Set是一个新增的数据结构,可以用来保存数据,类…

ES6~ES12——Array Includes、Object values、Object entries、Object fromEntries、flat、flatMap、空值合并运算符、可选链等

一、ES7 - Array Includes 在ES7之前,如果我们想判断一个数组中是否包含某个元素,需要通过 indexOf 获取结果,并且判断是否为 -1。 在ES7中,我们可以通过includes来判断一个数组中是否包含一个指定的元素,根据情况&…

移除通知的时机

链接 结论 最好是在不需要的时候就移除掉。 如果不是特别苛刻,可以直接在dealloc函数里写。因为dealloc函数一定会被调用的。 在dealloc函数中移除的可能问题 由于dealloc在Runloop结束时会被调用。如果在Runloop调用之前,又有一个通知到来,会…

JS高级——Proxy、Reflect

一、监听对象的操作 我们先来看一个需求:有一个对象,我们希望监听这个对象中的属性被设置或获取的过程 通过我们前面所学的知识,能不能做到这一点呢?其实是可以的,我们可以通过之前的属性描述符中的存储属性描述符来…

Promise学习笔记

一、异步任务的处理 这里我从一个实际的例子来作为切入点: 我们调用一个函数,这个函数中发送网络请求(我们可以用定时器来模拟);如果发送网络请求成功了,那么告知调用者发送成功,并且将相关数…

JS高级——Iterator迭代器、Generator生成器

一、什么是迭代器? 在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol): 迭代器协议定义了产生一系列值(无论是有限还是无限个)的标准方式&…

删除一行下方单元格上移_快速删除Excel工作表多余空单元格

从其他地方复制了数据,有时候会出现多余的空单元格。手动删除很麻烦,就像下面的图中的工作表区域。下面介绍一种方法,可以快速删除多余空单元格。1.选中目标区域,在这里就选中A1:A9的单元格区域。2.按键盘上的F5或者CtrlG。3.点击…

JS高级——await-async

一、异步函数 async function async关键字用于声明一个异步函数: async是asynchronous单词的缩写,异步、非同步;sync是synchronous单词的缩写,同步、同时; async异步函数可以有很多中写法: 二、异步函…

图象关于y轴对称是什么意思_数学概念丨“图象”与“图像”是有区别的 ,你知道吗?...

你与数学间只差一个公众号解读教材教法,研究解题策略,传播数学文化,推广数学应用,推送知识干货,分享学习方法。精彩分享初一数学全国各地期中试卷150套,word版初二数学全国各地期中试卷150套,wo…

数据压缩 第二次作业

1.设X是一个随机变量&#xff0c;取值范围是一个包含M个字母的符号集。证明0<H(X)<log2M。 2.证明如果观察到一个序列的元素为iid分布&#xff0c;则该序列的熵等于一阶熵。 3.给定符号集A{a1,a2,a3,a4},求以下条件下的一阶熵&#xff1a; (a) p(a1)p(a2)p(a3)p(a4)1/4 (…

JS高级——错误处理

一、错误处理方案 开发中我们会封装一些工具函数&#xff0c;封装之后给别人使用&#xff1a; 在其他人使用的过程中&#xff0c;可能会传递一些参数&#xff1b;对于函数来说&#xff0c;需要对这些参数进行验证&#xff0c;否则可能得到的是我们不想要的结果&#xff1b; …