步遥——面向对象设计程序
1:什么是对象?
对象是无序属性的集合,其属性可以包含基本值,对象或者函数,可以把对象想象成散列表,一组名值对,其中值可以是数据或函数,名是字符串。
2:如何创建对象?
创建一个对象:
var person = {
name:'Nicholas',
age:'29',
job:'Software English',
sayName:function(){
alert(this.name)
}
}
2.1:认识对象中的属性的特征:
2.1.1 管理数据的属性:
[[Configurable]]:true//能通过delete删除属性并重新定义;
[[Enumerable]]:true//能通过for-in循环访问的属性
[[Writable]]:true//能修改属性的值
[[Value]]:true//属性的值
如果想修改对象的属性的特性,需要使用下面方法:
Object.defineProperty(person,'name',{
writable:false,//不能修改属性值
value:'Nicholas'
})
2.1.2 管理访问的属性:
[[Configurable]]:true//表示能够通过delete删除属性从而重新定义属性,能够修改属性的特性。
[[Enumerable]]:true//表示能够通过for-in循环访问的属性
[[Get]]:在读取属性时调用的函数,记住了是一个函数,这个函数一般返回一个值,即要访问的属性的值
[[Set]]:在写入属性时调用的函数,记住也是一个函数
以上的访问器属性也必须通过Object.defineProperty()定义
练习一下:
let person = {
_name:'Nicholas',
age:29,
job:'Software English',
sayName:function(){
alert(this._name)
}
}
Object.defineProperty(person,'name',{
get:function(){
return this._name;
},
set:function(value){
this._name = value;
}
})
// person.name = 'aaa'
console.log(person.name)
person中没有最初没有定义name属性,但是使用Object.defineProperty()方法定义了对name的访问属性,就是在访问的name的时候,会根据get和set方法的定义去获取或更改name的值,一开始没有定义name属性但是访问name时会由get方法,返回_name的值,更改name的属性,会利用set方法,变通的修改_name的值,好像一种障眼法。读取和修改的属性name其实都是另一个属性_name的值,而name这个属性有点像一个‘傀儡’,真正的核心属性竟然是_name。
当要定义多个属性时:就要使用Object.definePropertyies(person,{
_year:{//数据属性
value:2020
},
name:{//数据属性
value:'Nicholas'
},
edition:{//访问器属性
get:function(){return this._year},
set:function(value){this._year = value}
}
})
3:以上是给对象属性设置属性,读取设置的属性可以使用:Object.getOwnPropertyDescriptor(person,'name'),该值返回一个对象,对象中包含了数据属性和访问属性,依次读取对象中的属性设置:
let descriptor = Object.getOwnPropertyDescriptor(person,,'name')
descriptor.configurable// 读取设置的configurable属性,查看下name属性是否可以通过delete删除,是否可修改
以上认识了什么是对象,对象怎么建立,和对象中的属性可以怎么管理,有什么特性。就让我们更深入的理解了对象的含义。就像对象的数据属性,不是每个属性都是千篇一律的用来存一下数据值,你可以通过修改writable属性,不准修改它,也不是所有的属性值都能访问的,如果你把enumerable属性设置为false,那这个值你在for-in循环遍历时就访问不到了;抑或是有个属性值不想被外界直接访问到,可以通过定义一个‘傀儡’属性,让外界间接的访问到该属性等等。
从有关属性的属性描述中,我们更能了解到,组成一个对象的不仅仅是只有属性成员,还有对每个成员属性的设置,犹如洋葱一般,拨开对象的外衣,内部的结构是由这些属性描述进行修饰的。