前言
ECMAScript中我觉得非常重要的一块就是对于对象的理解了,就我个人而言,我的理解还是不够透彻的; 所以这篇文章不扯多深,只扯扯比较表层的知识;
何为面向对象
面向对象的定义是比较好比喻的,比如一个人,有什么特征,这是特征就是对象属性,而不同的人又相同的地方和自身亮点; 这样就是从单一对象过渡到继承,拓展;[注:ES6之前没有类的说法,原生的继承也是不存在的;模拟居多]
ECMA的定义就是: “无序属性的几何,其属性可以包含基本值,对象或者函数.”
在JS中,声明对象的方法有这么两种:声明和字面量;
代码语言:javascript复制 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;
代码语言:javascript复制 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);
定义多个属性
代码语言:javascript复制 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");
创建对象
代码语言:javascript复制.... 梳理中 ... 放到下一篇相关的文章
总结
至于对象的几种创建模式及继承的实现,我还要梳理一下,顺便把ES6的实现方法也穿插进去。。。 静候佳音~~~学习ing。。。。。