章节内容:高程3第6章
1、理解对象属性
2、理解并创建对象
3、理解继承
在java 、c++等语言中,有类的概念,它的对象是通过类来创建的,根据类可以创建具有多个属性和方法的集合,但在ECAMScript中,并没有类的概念,其将对象定义为“无序属性的集合”(键值对),可以将对象想象为散列表,一组名值对,其值可以为基本类型值、应用类型值或函数
一、理解对象
1.1 对象的创建
之前所学创建对象的方式有
var testObject = new Object();
testObject.att1="xx";
testObject.att2="xxx";
testObject att3 = function(){};
或者利用字面值法(较为常用)直接将对象以名值对的形式表示出来
var testObject = {
att1:"xx",
att2:"xxx",
att3:function(){}
};
1.2 属性类型
使用特性(property)来描述对象的属性(attribute),表述对象属性的各个特征。ECMAScript中有2中定义了2种属性,数据属性和访问器属性
数据属性是一个数据值所占的坑,能够读取和写入
- [[ Configurable]]:可配置的 能否通过delete删除并重新定义、能否将此属性修改为访问器属性
- [[Enumerable]]:可枚举,能否通过for-in返回属性
- [[Writable]]:可写
- [[Value]]:此属性的数据值,默认为undefined
通过Object.defineProperty()来修改属性的特性var1:对象 var2:属性名 var3:特性描述符对象
var person1 = {};
Object.defineProperty(person1, 'name', {
writable: false,
value: 'wang'
});
person1.name;
//"wang"
person1.name = 'tttt';
person1.name;
//"wang"
访问器属性:不包含数据值,但是包含setter和getter方法来代替值的操作。即读此属性时会调用getter()方法,写时会调用setter()方法
- [[Configurable]]:
- [[Enumerable]]:
- [[Get]]
- [[Set]]
同样特性是不能进行直接操作的,只能通过Object.defineProperty()来进行设置
var person={
name:'wang',
age:20
};
Object.defineProperty(
person,"nb",{
set:function(e){this.age+=e;},
get:function(){return this.age}
}
);
person.nb=111;
person.age;
person.nb;
//可以将数据属性转化为访问器属性
//在访问器属性中调用此访问器属性会 出现too much recursion(递归)的错误,应该在内部调用时,又会触发get方法 这样就死循环了
定义多个属性
注意一下代码运行的结果与书上有区别
问题已经解决 应该先把书先过一遍的,后面有描述数据属性的初值,configurable是false
var obj = {
};
Object.defineProperties(obj, {
'name': {
value: 'wang'
},
'age': {
value: 2019
},
'nb': {
set: function (e) {
this.age += e;
},
get: function () {
return this.age
}
}
});
//不知道是版本原因还是其它原因,这样设置的数据属性值并不如书上所说的是可以delete或者修改的
//在对age 进行delete 或者赋值后 其值并没有发生改变这一点之后在探究**
1.4 读取属性的特性
获取特性描述器:Object.getOwnPropertyDescriptor(对象,属性)