面向对象的前后相继设计-精通对象分分快三计划

作者:分分快三计划

3.概念五脾本性

时常要创制或改造四天个性,那时候能够运用Object.defineProperties()方法,它接受2个参数,要加上或退换属性的目的和二个映射表,包蕴名称和总体性描述符。

var book1 = {};
Object.defineProperties(book1,{
   _year:{
       value:'2008'
   },
   editor:{
       enumerable:true,
       value:'2'
   },
   year:{
       get:function () {
           return this._year;
       },
       set:function (newValue) {
           this._year = newValue;
           this.edition  = newValue - 2004;
       }
   }
});
 1     var book = {};
 2 
 3     Object.defineProperties(book,{
 4         _year: {
 5             value: 2004
 6         },
 7         edition: {
 8             value: 1
 9         },
10         year: {
11             get: function(){
12                 return this._year;
13             },
14             set: function(newValue){
15                 if(newValue > 2004){
16                     this._year = newValue;
17                     this.edition  = newValue - 2004;
18                 }
19             }
20         }
21     });

1.定义构造函数的三种艺术##

  // # 1.创建自定义对象的最简单方式就是创建一个 Object 的实例#
        var person = new Object();
        person.name = "Nicholas";
        person.age = 29;
        person.job = "Software Engineer";
        person.sayName = function(){
            alert(this.name);
        };

      //  2. 对象对象字面量
        var person = {
                                name: "Nicholas",
                                age: 29,
                                job: "Software Engineer",
                                sayName: function(){
                                                    alert(this.name);
                                            }
                                };
1.查询对象可扩充性
var teacher = {age:25};
//true:代表可拓展
console.log(Object.isExtensible(teacher));

2.属性类型

ECMAScript 中有二种特性:数据属性和做客器属性。

2.转移为不可扩充(“锁定指标”)
Object.preventExtensions(teacher);
//false
console.log(Object.isExtensible(teacher));
try{
    teacher.subject = 'math';
}catch (e) {
    //TypeError: Cannot add property subject, object is not extensible
    console.log(e);
}

转换来不可扩充的操作是不可逆的,何况只好影响到对象自己的可扩充性,即便给三个不得拓展目的的原型增添属性,那个不可扩充目的同样会持续这个新属性。

 

3.概念两特个性##

出于为对象定义三个属性的或然一点都不小, ECMAScript 5 又定义了四个Object.defineProperties()方法。利用那些措施能够经过陈诉符叁遍定义八个天性。那些艺术接收多少个指标参数:第贰个指标是要丰富和修改其性质的靶子,第二个对象的属性与第二个目的中要抬高或改换的品质一一对
应。例如:

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;
            }
      }
  }
});

解释: 上述代码在 book 对象上定义了五个数据属性(_year 和 edition)和贰个拜候器属性(year)。最后的目的与上一节中定义的靶子一样。独一的差别是此处的性质都以在同一时间成立的。

版本: *扶植 Object.defineProperties()方法的浏览器有 IE9 、 Firefox 4 、 Safari 5 、 Opera 12 和
Chrome。

4.对象的可扩充性

目的的可扩充性表示是不是能够给指标增添新属性。全数内置对象和自定义对象都以显式可扩大的,宿主对象的可扩大性是由Javascript引擎定义的。

[[Get]]:在读取属性时调用的函数。暗中同意值为undefined

1. 多少属性###

  1. [[Configurable]]:表示是或不是通过 delete 删除属性进而再一次定义属性,能还是不能修改属性的特点,大概是还是不是把质量修改为访谈器属性。像前边例子中那么直接在指标上定义的习性,它们的那些特点暗中同意值为 true。

  2. [[Enumerable]]:表示能还是无法通过 for-in 循环再次来到属性。像前面例子中那么直接在指标上定义的属性,它们的那几个特点暗中认可值为 true。

  3. [[Writable]]:表示能或不可能修改属性的值。像前面例子中那么直接在目的上定义的质量,它们的这几个特点默许值为 true。

  4. [[Value]]:包括那本特性的数据值。读取属性值的时候,从这么些地方读;写入属性值的时候,把新值保存在这一个职分。那性情子的暗中同意值为 undefined。

对于像前面例子中那么直接在指标上定义的性质,它们[[Configurable]]、 [[Enumerable]]和[[Writable]]个性都被设置为 true,而[[Value]]特点被设置为内定的值。举例:

      var person = {
          name: "Nicholas"
      };

注意: 这里开创了三个名称为 name 的性质,为它钦赐的值是"Nicolas"。也正是说, [[Value]]特征将被装置为"Nicholas",而对那个值的其他修改都将展现在这里个任务。

  • 要修改属性默许的性状,必需利用 ECMAScript 5 Object.defineProperty()方法。这几个措施接收四个参数:属性所在的指标、属性的名字和多少个描述符对象。此中,描述符(descriptor)对象的性质必得是: configurable、 enumerable、 writable 和 value。设置在那之中的一或多少个值,能够修改对应的性状值。举例:
              var person = {};
              Object.defineProperty(person, "name", {
                        writable: false,    // ** 表示只读 **
                        value: "Nicholas"
              });
              alert(person.name); //"Nicholas"
              person.name = "Greg";
              alert(person.name); //"Nicholas"

** 分析:** * 那个例子创立了三个名字为 name 的个性,它的值"Nicolas"是只读的。那几个性格的值是不足修改的,若是尝试为它内定新值,则在非严峻格局下,赋值操作将被忽视;在严苛情势下,赋值操作将会招致抛出荒谬。*


类似的条条框框也适用于不可配置的习性。例如:

               var person = {};
               Object.defineProperty(person, "name", {
                               configurable: false,  //表示不能删除
                               value: "Nicholas"
                         });
                   alert(person.name); //"Nicholas"
                   delete person.name;
                   alert(person.name); //"Nicholas"

注意: 把 configurable 设置为 false,表示不可能从目的中剔除属性。固然对这一个天性调用 delete,则在非严峻格局下如何也不会生出,而在严格情势下会招致错误。何况,一旦把质量定义为不可配置的,就不能够再把它变回可布署了。此时,再调用 Object.defineProperty()方法修改除 writable 之外的特点,都会招致错误:

var person = {};
Object.defineProperty(person, "name", {
        configurable: false,
        value: "Nicholas"
    });
      //抛出错误
Object.defineProperty(person, "name", {
        configurable: true,
        value: "Nicholas"
  });

注意:
1.也正是说,能够频仍调用 Object.defineProperty()方法修改同贰个属性,但在把 configurable本性设置为 false 之后就能有限制了。
2.在调用 Object.defineProperty()方法时,借使不内定, configurable、 enumerable 和writable 性情的默许值都以false。大多情景下,可能都未曾必要采取Object.defineProperty()方法提供的这个高端功用。可是,掌握这一个概念对驾驭JavaScript 对象却极度实用。

1.多少属性

多少属性的4性境况:

  • Configurable:①象征是还是不是通过delete删除属性进而再度定义,②是还是不是修改属性的性状,③是还是不是把品质修改为访问器属性。对象间接量里暗中认可值true。
  • Enumerable:表示是或不是通过for-in循环再次回到属性。对象直接量里暗中同意值true。
  • Writable:表示能还是不可能修改属性的值。对象直接量里暗中认可值true。
  • Value:包含这么些特性的数据值。对象直接量里暗中同意值undefined。
//查看对象直接量的属性的属性特性默认值
var people = {
    name:'jaychou',
    sayName:function () {
        console.log(this.name);
    }
};
/**{value: "jaychou", writable: true, enumerable: true, configurable: true}*/
console.log(Object.getOwnPropertyDescriptor(people,'name'));
/**{value: ƒ, writable: true, enumerable: true, configurable: true}*/
console.log(Object.getOwnPropertyDescriptor(people,'sayName'));
//getOwnPropertyDescriptor对于继承属性和不存在的属性,返回undefined

要修改属性默许的特点,使用Object.defineProperty()方法,接收3个参数:对象,属性名字和描述符对象。

//修改属性默认特性:
Object.defineProperty(person,'job',{
    emumerable:false,//不可枚举
    value:'singer',
    writable:false,//不可写
    configurable:true
});
/**{name: "jaychou", sayName: ƒ, job: "singer"}*/
console.log(person);
for(var prop in person){
    //打印name,sayName
    console.log(prop);
}
//会报错
try{
    person.job = 'director';
}catch (e) {
    //Cannot assign to read only property 'job' of object
    console.log(e);
}

能够频频调用Object.defineProperty()方法修改同贰天天性,但在把configurable天性设置为false之后就能够有限量了:

Object.defineProperty(person,'height',{
    configurable:false,//不可配置
    writable:true,
    value:172
});
try{
    Object.defineProperty(person,'height',{
        configurable:true,//出错
        enumerable:true,//出错
        value:175,//正常
        writable:false,//writable从true变false可以,false变true也会出错
    });
}catch (e) {
    //Cannot redefine property: height at Function.defineProperty
    console.log(e);
}
try{
    delete person.height;
}catch (e) {
    //设置成不可配置后也不可删除:Cannot delete property 'height' of #<Object>
    console.log(e);
}

除此以外,调用 Object.defineProperty()方法时,即便不内定,configurable、enumerable 和 writable 性子的暗许值都是 false。如果是修改已有品质,则无此限制。


2. 拜见器属性

** 访问器属性不含有数据值;它们含有一对儿 getter 和 setter 函数(然则,那七个函数都不是必备的)。在读取访问器属性时,会调用 getter 函数,这一个函数负担再次回到有效的值;在写入访谈器属性时,会调用setter 函数并传播新值,这些函数负担调节哪些管理数量。访谈器属性有如下 4 个特点。**

1 . [[Configurable]]:表示能或不能够通过 delete 删除属性进而再一次定义属性,能或不能够修改属性的特色,可能是或不是把质量修改为数据属性。对于平昔在对象上定义的品质,那一个特点的暗许值为true。
2 . [[Enumerable]]:表示能或不能通过 for-in 循环重返属性。对于一贯在目标上定义的性质,那么些特点的暗中认可值为 true。
3 . [[Get]]:在读取属性时调用的函数。私下认可值为 undefined。
4 . [[Set]]:在写入属性时调用的函数。暗中认可值为 undefined。

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 = 2005;   //这是写入的时候。
alert(book.edition); //2

解释: 以上代码成立了三个 book 对象,并给它定义四个默许的习性: _year 和 edition。 _year 前边的下划线是一种常用的记号,用于表示只好通过对象方法访谈的天性。而访谈器属性 year 则含有二个getter 函数和二个 setter 函数。 getter 函数再次回到_year 的值, setter 函数通过测算来规定科学的版本。由此,把 year 属性修改为 2007 会产生_year 形成 贰零零伍,而 edition 变为 2。那是选用访问器属性的布满格局,即设置贰天性质的值会导致其余质量发生变化。

注意:不自然非要同期钦定 getter 和 setter。只内定 getter 意味着属性是不能够写,尝试写入属性会被忽略。在严苛情势下,尝试写入只钦定了 getter 函数的个性会抛出荒谬。类似地,只内定 setter 函数的属性也不能读,不然在非严苛情势下会重临undefined,而在严酷形式下会抛出荒唐。

非常景况:

/帮助 ECMAScript 5 的那几个艺术的浏览器有 IE9 (IE8 只是一些实现)、 Firefox 4 、 Safari 5 、 Opera
12 和 Chrome 。 在 这 个 方 法 之 前 , 要 创 建 访 问 器 属 性 , 一 般 都 使 用 两 个 非 标 准 的 方 法 :
defineGetter()和defineSetter()。那五个点子最先是由 Firefox 引进的,后来 Safari 3、
Chrome 1 和 Opera 9.5 也交由了同等的完成。使用那七个遗留的法子,能够像上边那样重写前面包车型地铁事例。
/

var book = {
      _year: 2004,
      edition: 1
  };
//定义访问器的旧有方法
book.__defineGetter__("year", function(){
      return this._year;
    });
book.__defineSetter__("year", function(newValue){
        if (newValue > 2004) {
            this._year = newValue;
            this.edition  = newValue - 2004;
        }
  });
  book.year = 2005;
  alert(book.edition); //2

2.积累器属性

存款和储蓄器属性不包括数据值,只饱含富含 getter 和 setter 函数(非必得)。 在读取存款和储蓄器属性时,会调用 getter 函数,这么些函数负担再次来到有效的值;在写入存款和储蓄器属性时,会调用 setter 函数并传到新值,那个函数担任调节如哪儿理数量。4个属性个性如下:

  • Configurable:①代表是还是不是通过delete删除属性进而再度定义,②是或不是修改属性的天性,③是不是把品质修改为多少属性。对象直接量的私下认可值true
  • Enumerable:表示是或不是通过for-in循环重回属性。对象直接量的暗中同意值true
  • Get:在读取属性时调用的函数。对象直接量暗中认可值undefined
  • Set:在写入属性时调用的函数。对象直接量的暗许值undefined

概念存储器属性最简便易行的办法是采纳对象直接量语法的进展写法:

var p = {
    x:3.0,
    y:4.0,
    //r是可读写的存取器属性
    get r(){return Math.sqrt(this.x*this.x this.y*this.y);},
    set r(newValue){
        var oldvalue = Math.sqrt(this.x*this.x this.y*this.y);
        var ratio = newValue/oldvalue;
        this.x *= ratio;
        this.y *= ratio;
    },
    //theta是只读存取器属性
    get theta(){return Math.atan2(this.y,this.x);}
}
console.log(p.r);
p.r = 25;

行使Object.defineProperty()方法定义存款和储蓄器属性:

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;
        }
    }
})
/**{get: ƒ, set: ƒ, enumerable: false, configurable: false}*/
console.log(Object.getOwnPropertyDescriptor(book,'year'));

如例子所示,使用存款和储蓄器属性的大规模方式,即设置壹脾品质的值会形成其余属性产生变化。还会有一种普及正是当今风行的近乎于Vue的响应式原理,就是把data中的属性都使用defineProperty修改为存款和储蓄器属性,能够监听到数码的转移。

 

4.读取属性的表征##

选取 ECMAScript 5 的 Object.getOwnPropertyDescriptor()方法,能够取得给定属性的陈说符。那几个法子接收五个参数:属性所在的对象和要读取其汇报符的性质名称。重返值是叁个目的,即便是访问器属性,那几个目的的天性有 configurable、 enumerable、 get 和 set;如若是多少属性,那些目的的属性有 configurable、 enumerable、 writable 和 value。比方:

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");
alert(descriptor.value); //2004
alert(descriptor.configurable); //false

alert(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"

解释: 对于数据属性_year, value 等于最早的值, configurable 是 false,而 get 等于 undefined。对于访谈器属性 year, value 等于 undefined, enumerable 是 false,而 get 是三个针对性 getter函数的指针。
** 版本(使用限制):在 JavaScript 中,能够本着别的对象——富含 DOM 和 BOM 对象,使用 Object.getOwnPropertyDescriptor()方法。协助那些格局的浏览器有 IE9 、 Firefox 4 、 Safari 5 、 Opera 12 和 Chrome。**

写在前方

注:那几个类别是笔者对js知识的部分梳理,在那之中大多内容出自书籍:Javascript高档程序设计第三版和JavaScript权威指南第六版,感激它们的撰稿人和翻译。有觉察怎么难点的,迎接留言提议。

那是利用访问器的大范围方法,即设置三个性格的值会招致其他品质发生变化,year前面包车型地铁下划线是一种

6.结霜对象

结霜比密闭对象多的功效是:能够将它自有的具有数据属性设置为只读(假设指标的存取器属性具备setter方法,存取器属性将不受影响,仍可以够由此给属性赋值调用它们)。

var tea2 = {subject:'Chinese'};
//false:代表未冻结
console.log(Object.isFrozen(tea2));
Object.freeze(tea2);
try{
    tea2.subject = 'math';
}catch (e) {
    //TypeError: Cannot assign to read only property 'subject' of object
    console.log(e);
}
//true:已冻结
console.log(Object.isFrozen(tea2));

[[Writable]]:表示是还是不是通过退换属性的值,暗许值为true

7.属性性情准则计算

  • 假使目的是不足扩充的,则足以编写已部分自有质量,但无法给它丰盛新属性。
  • 一旦属性是不足配置的,则无法修改它的可配置性和可枚举性。
  • 如果存取器属性是不行配置的,则不可能改改其getter和setter方法,也无法将它调换为数量属性。
  • 借使数量属性是不可配置的,则不能够将它调换为存取器属性。
  • 比如数额属性是不行配置的,则不能够将它的可写性从false修改为true,但足以从true修改为false。
  • 假若数额属性是不行配置且不可写的,则无法修改它的值。但是可配置但不可写属性的值是能够修改的(做法:先将它标识为可写的,然后修改它的值,最终转变为不可写的)。

 

5.密闭目的

密闭对象比锁定指标更加高一层,除了不足扩充以外,对象的持有自己性质都设置成了不足配置的。同样密闭对象操作是不可逆的。

var tea1 = {subject:'math'};
//false:代表未密封
console.log(Object.isSealed(tea1));
Object.seal(tea1);
try{
    Object.defineProperty(tea1,'subject',{
        //enumerable:false,//出错
        //configurable:true,//出错
        writable:false//和上面说的一样,writable从true变成false可以,false变成true则出错
    });
}catch (e) {
    console.log('出错..');
    console.log(e);
}
//true:已密封
console.log(Object.isSealed(tea1));

读取属性的天性


概念七个属性

 1     var person = {};
 2     Object.defineProperty(person,"name",{
 3         configurable: false,
 4         value: "Nicholas"
 5     });
 6 
 7     //抛出错误
 8     Object.defineProperty(person,"name",{
 9         configurable: true,
10         value:"Nicholas"
11     });

Object.getOwnPropertyDescriptor()方法,能够博得给定属性的汇报符

多少属性包括多少个数据值的职责。在这里个职位能够读取和写入值。数据属性有4个描述其行为的表征

 

 

 

在调用Object.defineProperty()方法时,倘使不钦点,configurable、enumerable和writable性格的暗中认可值都以false

常用的号子,用于表示只可以通过对象方法访谈的属性

2、访谈器属性

要修改属性默许的表征,必得采用ECMAScript5的Object.defineProperty()这么些方法.这么些方法接受两个参数:属性所在的目的、属性的名字和一个描述符对象

[[Configurable]]:表示是或不是通过delete输出属性进而定义属性,能还是不能够修改属性的性状,可能是不是把质量修改为访谈器属性,暗中同意值为true

[[Enumerable]]:表示能不能够通过for-in循环再次来到属性,暗许值为true

访谈器属性不蕴含属性值;他们带有一对儿getter和setter函数,在读取访谈器属性时,会调用setter函数,那一个函数担任重临有效的值,在写入访谈器属性时,会调用getter函数,并传到新值,这些函数决定如哪个地方理数据。访问器属性有如下4个特点

多少个非规范的方法:__defineGetter__()和__defineSetter__()

[[Configurable]]:表示是不是通过delete输出属性进而定义属性,能还是无法修改属性的特征,也许是不是把品质修改为访问器属性,默许值为true

 

 

 1     var book = {
 2         _year: 2004,
 3         edition: 1
 4     };
 5 
 6     Object.defineProperty(book,"year",{
 7         get: function(){
 8             return this._year;
 9         },
10         set: function(newValue){
11             if(newValue > 2004){
12                 this._year = newValue;
13                 this.edition  = newValue - 2004;
14             } 
15         }
16     });
17 
18     book.year = 2005;
19     console.log(book.edition); //2

 

 


 

[[Enumerable]]:表示能还是不能够通过for-in循环再次回到属性,私下认可值为true

创设自定义对象的最简易方法就是创立二个Object的实例,然后再为它加多属性和章程

 

拜会器属性无法一直定义,必得利用Object.defineProperty()来定义。

 1     Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符
 2 
 3     var book = {};
 4 
 5     Object.defineProperties(book,{
 6         _year: {
 7             value: 2004
 8         },
 9         edition: {
10             value: 1
11         },
12         year: {
13             get: function(){
14                 return this._year;
15             },
16             set: function(newValue){
17                 if(newValue > 2004){
18                     this._year = newValue;
19                     this.edition  = newValue - 2004;
20                 }
21             }
22         }
23     });
24 
25     var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
26     console.log(descriptor.value); //2004
27     console.log(descriptor.configurable); //false
28     console.log(typeof descriptor.get); //"underfined"
29 
30     var descriptor = Object.getOwnPropertyDescriptor(book,"year");
31     console.log(descriptor.value); //underfined
32     console.log(descriptor.enumerable); //false
33     console.log(typeof descriptor.get); //"function"

[[Value]]:包蕴那特特性的数据值,读取属性值的时候,从这些岗位读;写入属性值的时候,把新值保存在这里个职务

 

领悟对象

 

 

Object.defineProperties()方法。利用那几个形式能够通过陈诉符三回定义多特性子。

1     var person = {};
2     Object.defineProperty(person,"name",{
3         writable: false,//设置为不可修改属性的值
4         value: "Nicholas"
5     });
6 
7     console.log(person.name); // " Nicholas"
8     person.name = "Oreg";
9     console.log(person.name); // " Nicholas"
1     var person = {
2         name: "Nicholas",
3         age: 29,
4         job: "SoftWare Engineer",
5         sayName: function(){
6             alert(this.name);
7         }
8     };

 

不自然非要同期钦定getter和setter。只钦命getter意味着属性是不可能写的,只钦命setter函数的属性
也不可能读

创设对象的首荐情势是目的字面量情势

 

把donfigurable设置为false,表示不能够从指标中去除属性。一旦把品质定义为不可配置的,就无法再把它变回可配备的了。此时,在调用Object.defineProperty()方法修改处writable之外的表征,都会导致错误

[[Set]]:在写入属性时调用的函数。暗中同意值为undefined

1、数据属性

 1     var book = {
 2         _year: 2004,
 3         edition: 1
 4     };
 5 
 6     book.__defineGetter__("year",function(){
 7             return this._year;
 8         });
 9     book.__defineSetter__("yeat",function(newValue){
10                     if(newValue > 2004){
11                 this._year = newValue;
12                 this.edition  = newValue - 2004;
13             } 
14     });
15 
16     book.year = 2006;
17     console.log(book.year);

当中属性不可能直接待上访谈,ECMAScript5把它们放在两对方括号中,分为数据属性和做客器属性

 

属性类型

1     var person = new Object();
2     person.name = "Nicholas";
3     person.age = 29;
4     person.job = "SoftWare Engineer";
5     person.sayName = function(){
6         alert(this.name);
7     };

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划