步遥——面向对象设计程序

2020-12-01  本文已影响0人  你还想好吗

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循环遍历时就访问不到了;抑或是有个属性值不想被外界直接访问到,可以通过定义一个‘傀儡’属性,让外界间接的访问到该属性等等。

从有关属性的属性描述中,我们更能了解到,组成一个对象的不仅仅是只有属性成员,还有对每个成员属性的设置,犹如洋葱一般,拨开对象的外衣,内部的结构是由这些属性描述进行修饰的。

上一篇下一篇

猜你喜欢

热点阅读