JS面向对象设计-理解对象
不同于其他面向对象语言(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面向对象设计-理解对象的更多相关文章
- js面向对象设计之class继承
EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民.但是目前为止,这些关于类的新关键字仅仅是建立在旧的原型系统上的语法糖,所以它们并没有带来任何的新特性 ...
- js面向对象设计之class类
class 相对 function 是后出来的,既然 class 出来了,显然是为了解决 function 在处理面向对象设计中的缺陷而来.下面通过对比,来看看 class 作为 ES6 中的重大升级 ...
- js面向对象怎么理解
js面向对象怎么理解 <一>. 认识对象.首先要认识对象:在编程中,对象(object)是具体的某一个实例,唯一的某一个个体.如:电脑就是一个统称,而你面前的这一台电脑就是对象.而电脑的统 ...
- js面向对象设计之function类
本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...
- JS面向对象系列教程 — 对象的基本操作
面向对象概述  面向对象(Object Oriented)简称OO,它是一种编程思维,用于指导我们如何应对各种复杂的开发场景. 这里说的对象(Object),意思就是事物,在面向对象的思维中,它将一 ...
- 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作
页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...
- JS面向对象编程:对象
一般面向过程的写法都是写很多function,坏处:1.代码复用不好 2.函数名称容易重复冲突 下面介绍面向对象的写法: 在JS中每个函数function都是一个对象. 比如,下面这个就是一个对象,我 ...
- JS面向对象编程,对象,属性,方法。
document.write('<script type="text/javascript" src="http://api.map.baidu.com/api?v ...
- JS的从理解对象到创建对象
JavaScript不是一门真正的面向对象语言,因为它连最基本的类的概念都没有,因此它的对象和基于类的语言中的对象也会有所不同.ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对 ...
随机推荐
- Android: Error inflating class android.support.v4.view.ViewPager 问题的解决方法
ViewPager是个很好很强大的控件,很多应用用它来实现很酷的效果,但是很多情况下在运行时会遇到Error inflating class android.support.v4.view.ViewP ...
- 如何让ThinkPHP支持模糊搜索
最近ytkah在做一个ThinkPHP的项目时发现了一个问题,搜索的功能只能检索出以*为开头的内容,不能检索出中间的词.例如:搜索包含6775的产品,搜索结果为空,而搜索000-6775 就有两个结果 ...
- JDOJ 2982: 最大连续子段和问题
洛谷 P1115 最大子段和 洛谷传送门 JDOJ 2982: 最大连续子段和问题 JDOJ传送门 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NN, ...
- Windbg的快捷键
窗口切换 可以使用以下键盘快捷方式窗口之间进行切换. 项 效果 CTRL+TAB 调试信息窗口之间切换. 通过重复使用此密钥,你可以扫描通过的所有窗口,而不考虑是否浮动. 停靠本身,或选项卡式停靠窗口 ...
- 常见的概率分布类型(二)(Probability Distribution II)
以下是几种常见的离散型概率分布和连续型概率分布类型: 伯努利分布(Bernoulli Distribution):常称为0-1分布,即它的随机变量只取值0或者1. 伯努利试验是单次随机试验,只有&qu ...
- sharding-jdbc 分布式数据库中间件
小编今天在做Sharding-jdbc时出现了一些问题,就上网百一百,发现网上的sharding-jdbc的参考是挺少的,唉还是要继续学习看文档. Sharding-jdbc介绍 Sharding-J ...
- USB、UART、SPI等总线速率(转)
1. USB总线 USB1.1: ——-低速模式(low speed):1.5Mbps ——-全速模式(full speed): 12Mbps USB2.0:向下兼容.增加了高速模式,最大速率480M ...
- [算法模版]AC自动机
[算法模版]AC自动机 基础内容 板子不再赘述,OI-WIKI有详细讲解. \(query\)函数则是遍历文本串的所有位置,在文本串的每个位置都沿着\(fail\)跳到根,将沿途所有元素答案++.意义 ...
- springboot自定义页面拦截
项目结构图 页面拦截代码 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public vo ...
- HttpClient代理IP及设置连接读取超时
1.不废话,上代码: public static void main(String[] args) throws Exception { CloseableHttpClient httpClient ...