一、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)

JS面向对象——Object.defineProperty相关推荐

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

    一.Object.create() 这个方法用于创建一个新对象.被创建的对象的__proto__指向create函数第一个参数的原型对象prototype,在创建新对象时可以通过create函数第二个 ...

  2. js之Object.defineProperty和Object.defineProperties详解

    1. Object.defineProperty() Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象. 备注:应当直接在 ...

  3. [js] 举例说明Object.defineProperty会在什么情况下造成循环引用导致栈溢出?

    [js] 举例说明Object.defineProperty会在什么情况下造成循环引用导致栈溢出? var data = {count: 1,value: 2 } Object.definePrope ...

  4. Javascript面向对象:Object.defineProperty()与Object.defineProperties()

    对象属性的操作 let obj = {name: "ziu",age: 18 }console.log(obj.name) // 获取属性 obj.name = "ziu ...

  5. JS面向对象的程序设计

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中 对象与纯面向对象语言中的对象是不同的,ECMA标准定义 ...

  6. 从零开始学前端 - 16. JS对象Object介绍及常用方法

    作者: 她不美却常驻我心 博客地址: https://blog.csdn.net/qq_39506551 微信公众号:老王的前端分享 每篇文章纯属个人经验观点,如有错误疏漏欢迎指正.转载请附带作者信息 ...

  7. 9.JS面向对象补充

    JS面向对象补充 本文章来源于王红元老师(coderwhy)的 JS高级课程 附上链接:https://ke.qq.com/course/3619571 谁能拒绝一个*100%好评还加课的老师呢 目录 ...

  8. Object.defineProperty方法(详解)

    OK,这一篇主要想说一下Object.defineProperty这个方法. 这个方法也是Vue数据双向绑定原理的常见面试题 所以也是有必要好好掌握的哦 首先我们知道JS中是支持面向对象编程的,也是有 ...

  9. 对于js面向对象的理解

    面向对象:oop(这是一种编程思想) es5中 定义方式: 1. function 类名称() {} ==>new 类名称 (这样衍生出来的对象称为类的实例) 2. {} 3. Object 面 ...

最新文章

  1. 物联网背后的网络安全风险
  2. RBAC角色权限设计
  3. 微处理器含有高速缓存和什么_天天说芯片,芯片到底是什么?
  4. 在操作系统理论中,什么是饿死
  5. php gd库 函数 建立gif,PHP_PHP GD库生成图像的几个函数总结,使用GD库中提供的函数动态绘 - phpStudy...
  6. 步骤一:入门linux基础/01Linux简介和安装/003Linux系统的多面性
  7. ORA-28001: the password has expired (DBD ERROR: OCISessionBegin)解决办法
  8. android loader使用教程,Android Loader 机制,让你的数据加载更加轻松
  9. Java基础学习总结(167)——Java项目实践中如何实现幂等
  10. Leetcode每日一题:36.valid-sudoku(有效的数独)
  11. [java] Unsupported major.minor version 51.0 错误解决方案
  12. Dev-c++下载地址
  13. qcap 教程_高通平台抓取ramdump及使用qcap解析,ramdumpqcap
  14. oracle11g打补丁故障_针对Oracle11g补丁修补说明.docx
  15. python 实现简单画板_Python图像处理之简单画板实现方法
  16. mac 连接linux sh,ssh工具 – windows和mac 上ssh连接linux 服务器工具推荐 – The Hu Post...
  17. NOI2016铜色记
  18. 使用OBS录屏有很大的电流回声
  19. 关于各种职业的英文单词zz
  20. CSI笔记【2】:正交频分多路复用技术/OFDM

热门文章

  1. Python协程--生成器(通过异常来判断生成器已经结束)
  2. 2019如何转换2010_9102年,你还不知道PPT怎么转换成视频吗?小心落伍了
  3. win10怎么设置默认输入法_win10系统输入法失效打不了字怎么办
  4. php mysql删除失败_php+MySQL实战案例【七】数据编辑、删除
  5. loewe测试软件,实测Loewe三角包 最轻的小包最贴心的设计
  6. 线程自动退出_C++基础 多线程笔记(一)
  7. halcon资料链接
  8. C# 对Ini文件操作(C# ini文件操作类)
  9. u-boot启动参数命令格式
  10. Go语言之进阶篇http服务器获取客户端的一些信息