`

对象属性的特性

 
阅读更多

转自:http://www.cnblogs.com/yugege/p/4823863.html

 

1.ES5的属性特性包括下面六个

configurable: 表示能否通过delete来删除属性从而重新定义属性,能够修改属性的特性,默认为true
enumberable: 表示是否能通过for-in循环返回属性。默认为true
writable: 是否可以修改属性, 默认为true
value: 包含这个属性的数据值。读取属性值时3,从这个属性读,写入属性时,把新值保存到这个位置。默认值为undefine.
getter: 在读取属性时,调用的函数
setter: 在写入属性时调用的函数
特别注意:一旦调用了Object.defineProperty方法之后,那些未定义的特性值除了configurable为false之外,其他都为undefined;
 
2.修改单个属性的特性:
 
必须使用Object.defineProperty()方法。这个方法接受3个参数: 属性所在的对象,属性的名字,和一个描述符对象。其中描述符对象的属性必须是:configurable, enumberable, writable,value.设置其中一个或者多个值,可以修改对应的特性值。
修改writable特性,设置为false从而使得属性值不可修改,如下所示:
复制代码
var person = {};
Object.defineProperty(person, "name", {
  writable: false,//设置属性的特性为不可修改的
  value: "Tom"  //把name属性值设为Tom
});
person.name = "Jany"; //试图把name属性值设置为Jany,但是失败了.非严格模式下会忽略此语句,严格模式则会报错的
console.log(person.name); //结果仍然为Tom
复制代码
第2到第6行我们设置了name属性的值为Tom,并且把它的writable特性设置为false,然后,我们试图在地7行把它改Jany,但是,最终打印出来的结果仍然是zzy。
修改configurabel特性,设置为false使得属性无法被delete(删除),如下所示:
复制代码
var person = {};
Object.defineProperty(person, "name", {
  configurable: false, //把configurable设置为false
  value: "Tom"
});
console.log(person.name); //打印结果为Tom
delete person.name; //试图删除name属性
console.log(person.name); //但是name仍然存在,打印出Tom
复制代码
如果我们把configurable属性值改为true,则属性可以被delete
复制代码
 var person = {};
Object.defineProperty(person, "name", {
  configurable: true,
  value: "Tom"
});
console.log(person.name); //打印出Tom
delete person.name; //试图删除name属性
console.log(person.name); //删除成功,打印出udefined
复制代码
另外,一旦,我们我们把某个属性的特性设置成了不可配置的,就再也不能把它变回可配置的了。此时,调用Object.defineProperty()方法修改除了writable之外的特性都会报错。
如下:
复制代码
var person = {};
//把person.name属性的configurable设置为false;
Object.defineProperty(person, "name", {
  configurable: false,
  value: "Tome"
});
//然后试图重新把person.name属性的configurable设置为true;但是浏览器出现报错信息。
Object.defineProperty(person, "name", {
  configurable: true,
  value: "lyl"
});
 
console.log(person.name);
复制代码
 我们在浏览器会看到如下的报错信息:
 
修改getter和setter特性
复制代码
 //定义一个对象book
var book = {
  _year: 2004, //出版年份
  edition: 1  //版本号
};

//定义year属性的特性
Object.defineProperty(book, "year", {
  //重写get方法,即如果我们试图book.year获取year值时,实质上是获取book._year的值
  get: function() {
    return this._year;
  },
  //重写了set方法,每当对book.year进行赋值时,则相应的修改book._year和book.edition的值
  set: function(newValue) {
    if(newValue > 2004) {
      this._year = newValue;
      this.edition += newValue - 2004;
    }
  }
 
});
 
book.year = 2005;
console.log(book.edition); //2
复制代码

 

3.同时定义(修改)多个属性的特性
 
由于定义多个属性的可能性很大,因此ES5有定义一个Object.defineProperties方法。利用这个方法可以通过描述符一次定义多个属性。这个方法接受两个对象的参数;第一个对象是要添加和修改器属性的对象,第二个对象的属性与第一个对象中要添加或者修改的顺序一一对应。
复制代码
var book = {};
Object.defineProperties(book, {
  // 定义一个新的属性_year,并且他的值为2004
  _year: {
    value: 2004
  },
  // 定义一个新的属性edition,并且他的默认值是1,而且属性值是可修改的
  edition: {
    value: 1,
    writable: true// 可修改的
  },
  // 定义一个新的属性year,并且重写了他的get和set方法
  year: {
    get: function() {
      return this._year;
    },
    set: function(newValue){
      if(newValue > 2004) {
        //alert("ok");
        this._year = newValue;
        this.edition += newValue-2004;
      }
    }
  }
});
 
book.year = 2006;
console.log(book.edition);//3
复制代码
 
4.读取属性的特性
 
读取属性的特性,使用Object.getOwnPropertyDescriptor方法
复制代码

var book = {};
// 为该对象定义一些属性
Object.defineProperties(book, {
  _year: {
    value: 2004
  },
  edition: {
    value: 1,
    writable: true// 可修改的
  },
  year: {
    get: function() {
      return this._year;
    },
    set: function(newValue){
      if(newValue > 2004) {
        //alert("ok");
        this._year = newValue;
        this.edition += newValue-2004;
      }
    }
  }
});
 
//获取_year属性的特性
var descriptor1 = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor1.configurable); //false
console.log(descriptor1.enumberable); //undefinded
console.log(descriptor1.writable); //false
console.log(descriptor1.value); //2004
console.log(descriptor1.get); //undefined
console.log(descriptor1.set); //undefined
 
console.log("\n");
 
//获取year属性的特性
var descriptor2 = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor2.configurable); //false
console.log(descriptor2.enumberable); //undefined
console.log(descriptor2.writable); //undefined
console.log(descriptor2.value); //undefined
console.log(descriptor2.get); //function()
console.log(descriptor2.set); //function(value)
分享到:
评论

相关推荐

    js对象属性排序

    本篇文章将深入探讨JavaScript对象属性排序的原理、方法以及注意事项。 首先,了解JavaScript对象的基本特性是至关重要的。在ECMAScript规范中,对象的属性访问速度并不依赖于属性的位置或顺序,因为它们内部是通过...

    Java对象属性数据比较,返回变化数据

    总结起来,`Java对象属性数据比较,返回变化数据`这个主题涉及到Java的面向对象特性,包括对象、属性、以及反射API的使用。`ObjectCompareUtil`工具类提供了一种通用的方式来比较两个对象的属性,而`...

    JavaScript — 对象和属性的特性1

    总结来说,JavaScript中的对象和属性特性涉及原型链、内部特性、属性描述符和访问器等多个方面,理解并熟练运用这些概念是成为一名优秀的JavaScript开发者的关键。通过掌握这些知识,我们可以更好地控制对象的行为,...

    前端程序员面试分类真题11.pdf,这是一份不错的文件

    总结来说,前端程序员面试中,JavaScript的基础语法、内置对象、对象属性特性和DOM/BOM操作是常见的考察点。熟练掌握这些知识点对于前端开发人员至关重要,不仅能确保面试成功,也有利于日常开发工作的高效进行。

    一簿打尽常用对象属性、vba函数(大全)超链接版

    关键词"常用对象属性"指的是在编程中经常使用的对象及其相关的特性或设置,而"VBA函数"则是指在Visual Basic for Applications(VBA)编程环境中使用的各种内置函数。"大全"和"超链接版"暗示这不仅是一个详尽的列表...

    前端开源库-define-frozen-property

    冻结属性是一个重要的概念,它涉及到JavaScript的原型继承、对象属性特性以及数据安全等方面。在这篇文章中,我们将深入探讨`defineFrozenProperty`库的工作原理,以及在实际开发中的应用。 首先,我们需要了解...

    面对对象的四大特性

    封装是指将对象的状态(属性)和行为(方法)包装在一起,并对外部提供一个有限的接口来访问这些状态和行为的过程。封装的主要目的是为了增强代码的安全性和可维护性: - **数据封装**:隐藏对象的内部状态,只有...

    js解析XML常用对象、属性、方法

    节点对象属性** - `childNodes`: 返回当前节点的所有子节点集合。 - `firstChild`: 返回当前节点的第一个子节点。 - `lastChild`: 返回当前节点的最后一个子节点。 - `nextSibling`: 返回当前节点的下一个同级节点...

    Excel对象、属性、方法、实例

    接下来是属性,它是对象的特性或状态。例如,`Range`对象的`Value`属性代表该区域的数值,`Font`属性则包含了字体的样式、大小和颜色等信息。你可以读取或设置属性值来改变对象的状态。例如,`Range("A1").Value = ...

    动物特性的面向对象描述

    "动物特性的面向对象描述"这一主题,旨在探讨如何在Java中用面向对象的方式表示和处理动物的特性。 1. 类(Class)与对象(Object) - 类是创建对象的蓝图,它定义了一组具有相同属性(数据成员)和行为(方法)的...

    Codesys汇川AM600面向对象(动作方法属性).pdf

    - **属性**:属性是对象的状态,即对象中存储的数据。 - **方法**:方法是对象的行为,是与对象相关的操作或函数。 2. **在AM600上的面向对象编程** 在汇川AM600 上,开发者可以利用Codesys 提供的面向对象特性...

    JavaScript对象的特性与实践应用深入详解

    首先,JavaScript对象可以包含属性和方法,其中属性是键值对,表示对象的特征,方法是属性值为函数的对象属性,表示对象的行为。属性的键(key)是字符串,包括空字符串。而属性的值(value)可以是任何数据类型,...

    在asp中对象 属性 方法 集合这四者有什么关系.doc

    2. **属性(Property)**:属性是对象的特性,用于描述对象的状态。在ASP中,每个对象都有自己的属性,可以设置或获取。以 `Response` 对象为例,`Response.Buffer` 是一个属性,控制是否先将整个页面内容缓存在内存中...

    JS对象及属性参考手册

    5. 属性特性:JS对象有读写、只读、不存在等属性特性,可以通过 `Object.getOwnPropertyDescriptor()` 获取。 二、属性类型 1. 数据属性:包含数据值的属性,具有 `configurable`、`enumerable`、`writable` 和 `...

    面向对象特性代码解析

    **继承**是面向对象的另一个关键特性,它允许一个类(子类)继承另一个类(父类)的属性和行为。这提供了代码重用和层次结构构建的能力。例如: ```java class Student extends Person { private int grade; // ....

    JAVASCRIPT对象属性大全[参考].pdf

    本文将深入探讨JavaScript中的对象属性,包括它们的功能、用途以及如何使用。 1. **anchor对象**:在HTML中,`<A NAME>`标记创建的锚点可以作为一个链接的目标。`anchor`对象是`document`对象的一个属性,它自身...

    vfp对象及对象的属性、事件和方法

    在VFP中,类是描述对象特性的模板,它包含了对象可能具有的属性、可以响应的事件以及能够执行的方法。对象是类的具体表现,每个对象都有其唯一的标识符,确保在程序中的唯一性。例如,一个命令按钮是表单上的对象,...

    javascript面向对象之访问对象属性的两种方式分析.docx

    ### JavaScript面向对象之访问对象属性的两种方式分析 #### 一、引言 在JavaScript中,面向对象编程是一种常见的编程范式,它可以帮助开发者更好地组织和管理代码。访问对象属性是面向对象编程中最基本的操作之一...

    Excel VBA 对象属性函数参考chm.zip

    标题中的“对象属性函数参考”指的是VBA中关于对象的属性和函数的详细文档。属性是对象的特性,例如一个工作表的名称、单元格的值或字体颜色;函数则是可以执行特定任务的代码块,如计算、数据操作或界面控制。 ...

Global site tag (gtag.js) - Google Analytics