高程3笔记2:面向对象1

1.ECMAScript中有两种属性:数据属性和访问器属性
1)数据属性:
    Configurable:能否通过delete删除属性;注意:一旦设置不能删除属性,就再也无法改回来了;改回来会报错;
    Enumerable:能够通过for-in遍历访问;
    Writable:能否修改属性的值
    Value:属性的数据值;
2)访问器属性:
    configurable:能否通过delete删除属性
    enumerable:能否通过for-in遍历访问;
    get:在读取属性时调用;
    set:在设置属性时调用;
注:访问器属性的作用:即设置一个属性的值,会导致其他属性发生变化;
例: var book={
          _year:2004,
          edition:1
      }
      Object.defineProperty(book,'year',{
          get:function(){
              return '今年是'+this._year+'';
          },
          set:function(newValue){
              if(newValue>2004){
                  this._year=newValue;
                  this.edition+=newValue-2004;
              }
          }
      })
      book.year=2016;
      alert(book.edition)
2.修改属性:Object.defineProperty()
有是3个参数:1)对象 2)属性名 3)描述符对象:configurable,enumerable,writable,value
3.OO思想设计模式:
1)单例模式 缺点:使用一个接口,创建很多对象,会产生大量冗余代码;
解决措施:工厂模式
2)工厂模式 缺点:没有解决对象识别问题(即:怎样知道一个对象的类型)
解决措施:构造函数模式
构造函数本身也是函数,只不过可以创建对象而已;
3)构造函数模式 缺点:每个方法都是实例的私有方法,所以,不同实例上的同名方法实不相等的;
解决措施:原型模式
4)原型模式:
Object.getPrototypeOf(obj1); 返回的对象,就是对象obj1的原型;(不兼容IE678注意:虽然可以通过实例访问原型上的属性值,但不能通过对象实例重写原型中的值;这会导致给实例创建该属性,将会屏蔽原型中的该属性;
重置constructor,但不让其可枚举:
//重新设置constructor指向,但是不让其枚举出来;因为系统的属性一般不可枚举
    Object.defineProperty(F.prototype,'constructor',{
        enumerable:false,
        value:F
    })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值