面向对象的程序设计(1)

来源:互联网 发布:国外大数据最牛公司 编辑:程序博客网 时间:2024/05/29 15:59

面向对象的语言标志,就是他有一个类的概念,通过类可以创建多个具有相同属性的方法和对象。但是ECMAscript并没有类的概念,所以它的对象也与其他语言中的对象有所不同

ECMA把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数”
它基于引用类型,由引用类型创建出来。

创建对象可以通过new一个Object的实例出来,然后给他添加属性和方法

    var obj=new Object();    obj.name="burning";    obj.age=29;    obj.sayName=function(){        alert(this.name);    }    obj.sayName()//burning

第二种方法就是对象字面量

    var obj={        name:"burning",        age:29,        sayName:function(){            alert(this.name);        }    }    obj.sayName();//burning

在JavaScript中对象是一种基本的数据类型,在数据结构上是一种散列表,可以看作是属性的无序集合,除了原始值其他一切都是对象。可通过属性名访问这些值,而属性名可以是包含空字符在内的任意字符串。简单点说,一个对象就是一系列属性的集合,一个属性包含一个名字(key)和一个值(value)。

数据属性

ECMAscript中包含两种属性,数据属性和访问器属性,先谈谈数据属性

  1. [[Configurable]]:这个属性表示是否能够通过delete删除属性重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认值为true。
  2. [[Enumerable]]:这个属性表示是否能够通过for-in循环返回属性。默认值为true
  3. [[Writable]]:表示是否能够修改属性的值。默认值为true
  4. [[value]]:表示包含这个属性的数据值。读取数据的时候,从这个位置读;写入值的时候就是写入他的值,默认值为undefined。

若是要修改这些属性的值,需要使用到Object.defineProperty()方法,这个方法有三个参数:对象名,属性名,和描述符对象

    var person={};    Object.defineProperty(person,"name",{writable:false,value:"ROTK"});    console.log(person.name);//ROTK    person.name="burning"    console.log(person.name);//ROTK

当我设置了writable的时候,他就无法修改person.name的值了
**第二个参数值记得要”“引起来

我们可以通过Object.defineProperties()的方法定义多个属性

    var book={}    Object.defineProperties(book,{        _year:{            value:2017        },        edition:{            value:1        },        year:{            get:function(){                return this._year            },            set:function(newValue){                if (newValue>2017) {                    this._year=newValue;                    this.edition+=newValue-2017;                };            }        }    })

访问器属性

  1. [[configurable]]:表示是否能通过delete删除属性而重新定义属性,能否修改属性的特性,或者能否吧属性修改为数据属性。默认值为true
  2. [[Enumerable]]:能否通过for-in循环返回属性。默认值为true
  3. [[get]]:在读取属性时调用的函数。默认值为true
  4. [[set]]:在写入属性时调用的函数,默认值为true

访问器属性类似于数据属性,必须使用Object.defineProperty()来定义。

var book={        _year:2017,//下划线表示只能通过对象方法访问的属性值,也就是私有变量        edition:2    }    Object.defineProperty(book,"year",{        get:function(){            return 0        },        set:function(newValue){            if (newValue>2017) {                this._year=newValue;                this.edition+=newValue-2017;            }        }    })    book.year=2020;    alert(book.edition);//5

在上面这个例子中,我修改了get属性的值,让他返回0,我们发现如果对book.year进行输出,他永远都是0,然后我修改了set属性的值,使得edition的值发生了改变。出现了即设置一个属性的值会导致其他的值发生变化。

读取属性的特性
ECMAscript5提供了Object.getOwnPropertyDescriptor() 方法来取得给定属性的描述符。这个方法接收两个参数:对象名和和要读取其描述符的属性名称

var book={};    Object.defineProperties(book,{        _year:{            value:2004        },        edition:{            value:1        },        year:{            get:function(){                return this._year            },            set:function(newValue){                if (newValue>2004) {                    this._year=newValue                    this._edition+=newValue-2004                };            }        }    })    var descriptor=Object.getOwnPropertyDescriptor(book,"_year");    console.log(descriptor.value)//2004
原创粉丝点击