前言
ECMAScript中我觉得非常重要的一块就是对于对象的理解了,就我个人而言,我的理解还是不够透彻的;
所以这篇文章不扯多深,只扯扯比较表层的知识;
何为面向对象
面向对象的定义是比较好比喻的,比如一个人,有什么特征,这是特征就是对象属性,而不同的人又相同的地方和自身亮点;
这样就是从单一对象过渡到继承,拓展;[注:ES6之前没有类的说法,原生的继承也是不存在的;模拟居多]
ECMA的定义就是: “无序属性的几何,其属性可以包含基本值,对象或者函数.”
在JS中,声明对象的方法有这么两种:声明和字面量;
var x = {}; vay y = new Object(); x.name = "crper"
然而,从ES5开始,规范和定义就越发丰富了,现在我们来扯扯ES5新增或者完善老版本的;
属性类型
ECMAScript中有两种属性: 数据属性和访问器属性;
数据属性有四个行为特性:
1. [[Configurable]] : 若是设置为true,可以通过delete删除属性;若是false,则不可!!! 默认为true;
2. [[Enumerable]] : 是否允许for-in这类循环遍历属性值,默认为true;
3. [[Writable]] : 是否允许修改对象的属性值,默认为true;
4. [[Value]] : 对象的属性值,默认为undefined;
若是要修改其对象的行为特性,需要用Object.defineProperty
来实现[也可以理解为定义对象属性],
格式:Object.defineProperty(obj,attribute,{行为特性或带值})
看demo;
var x = {}; x.name = "crper"; Object.defineProperty(x,"age",{ writable:false, configurable:false, value:23 })
访问器属性有四个特性:
1. [[Configurable]] : 与数据属性一致;
2. [[Enumberable]] : 与数据属性一直;
3. [[Get]] : 在读取属性的时候调用函数,默认值为undefined;
4. [[Set]] : 在写入属性值的时候调用函数,默认值为undefined;
var book = { _year:2004, edition:1 }; Object.defineProperty(book,"year",{ get:function(){ return this._year; }, set:function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; console.log(book.edition);
定义多个属性
var my = {}; Object.defineProperties(my,{ name:{ value:"crper" }, age:{ value:23 }, read:{ get:function(){ return this.age; }, set:function(value){ if(value > 24){ return this.age = (value - 24); } } }
读取属性特性
读取属性特性可以使用Object,getOwnPropertyDescriptor(obj,attribute)
方法;
返回值是数据属性和访问器属性
接着上面一个例子;
Object.getOwnPropertyDescriptor(my,"age") ; Object.getOwnPropertyDescriptor(my,"name"); Object.getOwnPropertyDescriptor(my,"read");
创建对象
.... 梳理中 ... 放到下一篇相关的文章