不同于其他面向对象语言(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. Android: Error inflating class android.support.v4.view.ViewPager 问题的解决方法

    ViewPager是个很好很强大的控件,很多应用用它来实现很酷的效果,但是很多情况下在运行时会遇到Error inflating class android.support.v4.view.ViewP ...

  2. 如何让ThinkPHP支持模糊搜索

    最近ytkah在做一个ThinkPHP的项目时发现了一个问题,搜索的功能只能检索出以*为开头的内容,不能检索出中间的词.例如:搜索包含6775的产品,搜索结果为空,而搜索000-6775 就有两个结果 ...

  3. JDOJ 2982: 最大连续子段和问题

    洛谷 P1115 最大子段和 洛谷传送门 JDOJ 2982: 最大连续子段和问题 JDOJ传送门 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NN, ...

  4. Windbg的快捷键

    窗口切换 可以使用以下键盘快捷方式窗口之间进行切换. 项 效果 CTRL+TAB 调试信息窗口之间切换. 通过重复使用此密钥,你可以扫描通过的所有窗口,而不考虑是否浮动. 停靠本身,或选项卡式停靠窗口 ...

  5. 常见的概率分布类型(二)(Probability Distribution II)

    以下是几种常见的离散型概率分布和连续型概率分布类型: 伯努利分布(Bernoulli Distribution):常称为0-1分布,即它的随机变量只取值0或者1. 伯努利试验是单次随机试验,只有&qu ...

  6. sharding-jdbc 分布式数据库中间件

    小编今天在做Sharding-jdbc时出现了一些问题,就上网百一百,发现网上的sharding-jdbc的参考是挺少的,唉还是要继续学习看文档. Sharding-jdbc介绍 Sharding-J ...

  7. USB、UART、SPI等总线速率(转)

    1. USB总线 USB1.1: ——-低速模式(low speed):1.5Mbps ——-全速模式(full speed): 12Mbps USB2.0:向下兼容.增加了高速模式,最大速率480M ...

  8. [算法模版]AC自动机

    [算法模版]AC自动机 基础内容 板子不再赘述,OI-WIKI有详细讲解. \(query\)函数则是遍历文本串的所有位置,在文本串的每个位置都沿着\(fail\)跳到根,将沿途所有元素答案++.意义 ...

  9. springboot自定义页面拦截

    项目结构图 页面拦截代码 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public vo ...

  10. HttpClient代理IP及设置连接读取超时

    1.不废话,上代码: public static void main(String[] args) throws Exception { CloseableHttpClient httpClient ...