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

本文介绍了JavaScript中的面向对象特性,强调了没有类概念的事实,对象基于引用类型创建。讨论了通过Object实例和对象字面量创建对象的方式。文章深入探讨了数据属性和访问器属性,包括它们的配置性、枚举性、可写性和值。还提到了使用`Object.defineProperty()`方法修改属性特性,并展示了如何通过访问器属性实现属性值的联动效果。最后,提到了`Object.getOwnPropertyDescriptor()`方法用于获取属性描述符。
摘要由CSDN通过智能技术生成

面向对象的语言标志,就是他有一个类的概念,通过类可以创建多个具有相同属性的方法和对象。但是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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值