面向对象的程序设计-对象的属性

es5以及之前版本的ECMAScript是没有类(对某些抽象的类型的属性和方法的封装)的概念的,不像java一些语言中,要先声明一个类再去new出这个对象.
在es5中使用构造函数(原则上也是一种函数)实现了对属性和方法的封装,更方便去定义相似的实实例的

对象的创建方式

javascript中想要创建一个对象还挺容易的

var person=new Object()
person.name='jack';
person.sayName=function(){    
alert(this.name)
}
这里定义了对象的属性和方法Object是超级父类

之后也出现了一种采用字面量定义的方式

var person={
    name : 'jack',
       sayName : function(){
        alert(this.name)
    }
}
这样创建会更方便一些

但是设想一下如果现在有一个班级要求创建出班级所有学生对象并包含一些他们的基本信息(姓名,年龄…)和一些共同的行为(上课,考试…), 如果这时候一个一个的用字面量去创建那不是太麻烦了
所以这时候最好的办法就是创建一个构造函数,里面包含需要的属性(姓名,年龄…),和一些共同的方法(上课,考试…)

function Student(name,age){
    this.name=name;
    this.age=age;
}
Student.prototype.test=function(){
    alert('kaoshi')
}

每次new Student('xxx',yyy)传入参数就能代表这个对象了
所以面向对象对数据有很好的封装性

对象中的属性类型

一.数据属性 (了解)
数据属性拥有四个描述其行为的特性
1. Configurable
2. Enumerable
3. Writable
4. Value
在这里插入图片描述
修改默认特性Object.defineProperty(IE8中尽量不要使用)

要修改属性默认的特性必须通过
Object.defineProperty(属性对象,属性名,{
    (要修改的特性一个或多个)
    Writable:false,
    value:'jack'
})


把对象的某一属性值设置成不可写,再改变的话,非严格模式下忽略,严格模式下报错

Object.defineProperty(属性对象,属性名,{
    (要修改的特性一个或多个)
    Configurable:false,
    value:'jack'
})

一旦把属性定义为不可配置的就不能把它在定义成可配置的了
并且不能delete这个属性了,否则非严格模式下忽略,严格模式下报错
并且再调用 defineProperty 修改除Writable之外的特性都会报错

总之就是把Configurable设置成false后就不要删除这个属性或者再修改它的相关配置了

如果通过Object.defineProperty来创建新属性时,不指定Configurable ,Writable,Enumerable默认为false
二.访问器属性
访问器属性的四个特性

1. Configurable         
2. Enumerable
3. Get
4. Set

在这里插入图片描述
在Object.defineProperty这个方法之前,使用_defineGetter_()和_defineSetter_()创建访问器属性(详情看书P142)

使用:
_通常是访问器属性的标记
    var person={
        _name:'rose',
        age:18
    }
Object.defineProperty(对象,对象的属性,{
        get:function(){
            return this._name
        },
        set:function(newValue){
            this._name=newValue;
            this.age+=1
        }
    }
通过Object.defineProperty方法结合访问器属性为对象的属性设置setget方法,最主要的一点就是可以在获取或设置该属性值的时候有一些其他的操作
比如改变_name属性名的同时也想有逻辑的改变age这时通过简单的对象.属性=xxx,只能改变本身的属性值而不能进行其他的操作,而利用这一方式可以进行其他的逻辑操作

只指定get属性是不能写的,尝试去写非严格模式下忽略,严格模式下报错
只指定set属性是不能读的,尝试去读非严格模式下undefined,严格模式下报错

通过Object.defineProperties同时定义多个属性

Object.defineProperties(对象,{
    _year:{
        writable:true,
        value:2019
    },
   edition:{
        writable:true,
        value:2
    },
    year:{
        get:function(){
            return this._year
        }
    }
}

读取属性的特性

var descriptor=Object.getOwnPropertypeDescriptor(对象,属性名)

descriptor.特性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值