不同于其他面向对象语言(OO,Object-Oriented),JS的ECMAScript没有类的概念,

它把对象定义为"无序属性(基本值、对象、函数)的集合",类似于散列表.

每个对象都是基于一个引用类型(原生类型、自定义类型)创建的.

1. 理解对象

创建自定义对象(Object构造函数、对象字面量).

// Object构造函数:创建一个Object实例,再为实例添加属性和方法.
var person = new Object();
person.name = "xiao";
person.getName = function() {
console.log(this.name) // 被解析为person.name
} // 对象字面量: 属性在创建时带有一些特征值,JS通过特征值来定义它们的行为.
var person = {
name: "xiao";
getName: function() {
console.log(this.name)
}
}

1.1 属性类型(数据属性、访问器属性)

[[ ]]: 内部值(内部才用的特性)实现JS引擎,描述属性各种特征,JS不能直接访问.

1.1.1 数据属性

  • [[Configurable]]可用delete删除属性从而重新定义属性,修改属性特性、改为访问器属性.
  • [[Enumberable]]可用for-in循环返回属性.
  • [[Writable]]可修改属性值.
  • [[Value]]属性的数据值,默认为undefined.

ps. 直接在对象上定义的属性,他们的Configurable,Enumberable,Writable特性都为true.

修改属性默认的特性:Object.defineProperty()

/*
* 参数
* 1.属性所在对象
* 2.属性名字
* 3.一个描述符对象,描述符对象的属性必须是(configurable、enumerable、writable、value)
*/
var person = {};
Object.defineProperty(person, "name", {
writable: false, // 属性只读
value: "xiao"
})
console.log(person.name); // "xiao"
person.name = "da"; // 非严格模式下被忽视,严格模式下报错
console.log(person.name); // "xiao"
// 一旦属性定义为不可配置,将不能再把它变回可配置.
Object.defineProperty(person, "name", {
configurable: false, // 属性不可配置
value: "xiao"
})

ps. 用Object.defineproperty()方法创建新属性,如果不指定,Configurable,Enumberable,Writable特性默认为false.

1.1.2 访问器属性

不包含数据值,包含一对getter、setter函数(都不是必需的)

  • [[Configurable]]可用delete删除属性从而重新定义属性,修改属性特性、改为数据属性.
  • [[Enumberable]]可用for-in循环返回属性.
  • [[Get]]读取属性时调用的函数,默认为undefined.
  • [[Set]]写入属性时调用的函数,默认为undefined.

ps. 访问器属性不能直接定义,必须使用Object.defineProperty()

// 常见使用方式:设置一个属性的值会导致其他属性发生变化
var book = {
_year: 2018, // 只能通过对象方法访问的属性
edition: 1
}; Object.defineProperty(book, "year", {
get: function() { // __definGetter__
return this._year;
},
set: function(newValue) { // __definSetter__
if (newValue > 2018) {
this._year = newValue;
this.edition += newValue - 2018;
}
}
}); book.year = 2019; // 修改year属性会导致_year变成2019
console.log(book.edition); // edition变成2

在不支持Object.definProperty()方法的浏览器中不能修改[[Configurable]]和[[Enumberable]]

1.2 定义多个属性

Object.defineProperties()一次定义多个属性

/*
* 参数
* 1.要添加或修改其属性的对象
* 2.第二个对象的属性与第一个对象要添加或修改的属性一一对应
*/
var book = {};
Object.defineProperties(book, {
_year: {
writable: true,
value: 2018
},
edition: {
writable: true,
value: 1
},
year: {
get: function() {
return this._year;
},
set: function(newValue) {
if (newValue > 2018) {
this._year = newValue;
this.edition += newValue - 2018;
}
}
}
})

1.3 读取属性特性

Object.getOwnPropertyDescriptor()取得给定属性的描述符,返回值是一个对象(属性特有的特性)。

/*
* 参数
* 1.属性所在对象
* 2.要读取其描述符的属性名称
*/
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor.value); // 2018
console.log(descriptor.configurable); // false
console.log(descriptor.get); // "undefined",是数据属性,不是访问器属性 var descriptor = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor.value); // undefined,是访问器属性,不是数据属性
console.log(descriptor.configurable); // false
console.log(descriptor.get); // "function",是一个指向getter函数的指针

在JS中可以针对任何对象(包括DOM、BOM)使用Object.getOwnPropertyDescriptor()方法.

JS面向对象设计-理解对象的更多相关文章

  1. js面向对象设计之class继承

    EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民.但是目前为止,这些关于类的新关键字仅仅是建立在旧的原型系统上的语法糖,所以它们并没有带来任何的新特性 ...

  2. js面向对象设计之class类

    class 相对 function 是后出来的,既然 class 出来了,显然是为了解决 function 在处理面向对象设计中的缺陷而来.下面通过对比,来看看 class 作为 ES6 中的重大升级 ...

  3. js面向对象怎么理解

    js面向对象怎么理解 <一>. 认识对象.首先要认识对象:在编程中,对象(object)是具体的某一个实例,唯一的某一个个体.如:电脑就是一个统称,而你面前的这一台电脑就是对象.而电脑的统 ...

  4. js面向对象设计之function类

    本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...

  5. JS面向对象系列教程 — 对象的基本操作

    面向对象概述  面向对象(Object Oriented)简称OO,它是一种编程思维,用于指导我们如何应对各种复杂的开发场景. 这里说的对象(Object),意思就是事物,在面向对象的思维中,它将一 ...

  6. 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作

    页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...

  7. JS面向对象编程:对象

    一般面向过程的写法都是写很多function,坏处:1.代码复用不好 2.函数名称容易重复冲突 下面介绍面向对象的写法: 在JS中每个函数function都是一个对象. 比如,下面这个就是一个对象,我 ...

  8. JS面向对象编程,对象,属性,方法。

    document.write('<script type="text/javascript" src="http://api.map.baidu.com/api?v ...

  9. JS的从理解对象到创建对象

    JavaScript不是一门真正的面向对象语言,因为它连最基本的类的概念都没有,因此它的对象和基于类的语言中的对象也会有所不同.ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对 ...

随机推荐

  1. Latex使用过程中的一些总结

    本文主要总结在使用Latex过程中遇到的一些问题及解决方案. 一:关于参考文献 1.如何在paper同一处用\cite命令同时引用多篇文献? 用\cite{bibtex1}\cite{bibtex2} ...

  2. 201800628模拟赛T2——最大土地面积

    题目描述 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 输入输出格式 输入格式: 第1行一个正整数N,接下来N行,每行2个数x,y ...

  3. 线程全局修改、死锁、递归锁、信号量、GIL以及多进程和多线程的比较

    线程全局修改 x = 100 def func1(): global x print(x) changex() print(x) def changex(): global x x = 50 func ...

  4. ubuntu下vi/vim 的基本用法

    https://blog.csdn.net/weixin_37657720/article/details/80645991 :q!    不保存强制推出. :wq   保存并退出.

  5. selenium 中在 iframe 内的元素定位

    有些时候 元素明明就在 但是通过什么方式定位都提示 定位不到元素 此时就要考虑元素是不是内嵌在iframe 中 对于内嵌在 ifra中的元素定位 首先定位到 iframe 元素 例如 iframe = ...

  6. 修改了celery任务老是执行失败,跟shell中调试的结果不同

    因为没有重启celery,没有删除celerybeat-schedule,导致使用的task任务一直是原来缓存的,所以代码一直无法生效,也是日了狗了

  7. Debian使用小计

    1. Debian无法apt install debian安装完成后,如果运行apt install,提示 Media change: please insert the disc labeled ' ...

  8. 阿里云 azkaban 发邮件的坑

    azkaban : 是一个 任务调度平台 安装文档: https://azkaban.readthedocs.io/en/latest/getStarted.html 因为阿里云是禁止掉是STMP 2 ...

  9. IDEA中,使用maven-可视化-下载jar包的source和javadoc

    需求:想看jar包的源码和文档注释 操作:在Idea的右侧Maven窗口,选中一个Module,然后展开Dependencies|,选中一个依赖包,按住鼠标右键单击,选择Download Source ...

  10. jQuery学习路线。

    通过jQuery思维导图,来进行计划的温习/掌握 jQuery技能. 通过思维导图的思路学习,是很好的学习方法之一,思路清晰.跟上环节,易于贯通,重要的是少走弯路. 这里一共有6张图,第1张是大纲路线 ...