javascript学习笔记 - 面向对象 理解对象

ECMAScript 中有两种属性:数据属性和访问器属性

一 属性类型

  1.数据属性。数据属性有4个描述其行为的特性

    [[Configurable]]表示能否通过delete删除属性从而重新定义属性; 能否修改属性; 能否把属性修改为访问器属性。

      [[Enumerable]] 表示是否能通过for-in循环进行枚举。

      [[Writable]] 表示能否修改属性的值

      [[value]] 包含这个属性的值。读取和写入属性值,都是从这个位置来操作

   对象字面量初始化时定义的属性,这些特性默认都是为true。

       Object.defineProperty(object, property, descriptor) //descriptor 称为描述符对象

var person = {};
Object.defineProperty(person, "name", {
    writable: false,  //将对象属性设置为属性值不可修改
    value: "Nicholas" //初始化属性name的值。因为包含value特性,因此"name"属性是数值属性
});

alert(person.name); // Nicholas
person.name = "Greg";
alert(person.name); // Nicholas

       [[Configurable]] 特性如果设置为false,则不能使用delete删除这个属性。并且只能修改writable这个特性,其他的属性都将不能再修改。

  2.访问器属性

      访问器属性不包含数据值。属性由[[Configurable]] 和 [[Enumerable]] 组成。[[Get]] 和 [[Set]] 属性不是必须的。

      [[Get]] 和 [[Set]] 属性类似于PHP中的魔术方法。

var book = {
    _year:2004,
    edition:1
};
Object.defineProperty(book, "year", {//因为设置了get、set特性,因此"year"属性为访问器属性。不能再有value,writable特性
    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     

    只指定getter意味着属性是不能写。只指定setter意味着属性不可读。

    不支持Object.defineProperty()方法的浏览器,使用非标准方法:

      obj.__defineGetter__ 和 obj.__defineSetter__

    不支持Object.defineProperty()的浏览器不能修改[[Configurable]],[[Enumerable]] 这两个特性

二 定义多个属性

    Object.defineProperties() 定义多个属性

var book;
Object.defineProperties(book,{
    _year : { value : 2004 },    //数据属性
    edition : { value : 1 },        //数据属性
    year : {      //访问器属性
          get : function(){
                return this._year;
          },
          set: function(){
                ....
          }
    }
});

三 读取属性的特性

  Object.getOwnPropertyDescriptor(obj,attributeName)

    obj -- 属性所在的对象 、attributeName -- 要读取其描述符的属性名称。返回一个对象,根据属性的类型(数据属性、访问器属性),返回不同的4个特性的值。

  

  

时间: 2024-10-05 04:33:17

javascript学习笔记 - 面向对象 理解对象的相关文章

JavaScript学习笔记——3.系统对象

1.常用对象类型 时间(Date)对象 数学(Math)对象 字符串(String)对象 正则表达式(RegExp)对象 数组(Array)对象 2.Date对象: //var date= new Date(); .getYear() //获取年13 .getFullYear() //获取年2013 .getMonth() //获取月(需要+1) .getDate() //获取日 .getHours() //获取时 .getMinutes() //获取分 .getSeconds() //获取秒

JavaScript学习笔记2-数组对象

1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <script> 9 //合并数组 10 var arr1 = ["Hello","World",&q

javascript学习笔记(三) string对象中的正则表达式

1. search返回匹配到的位置(-1找不到) var str = 'html js' var pattern = /js/ str.search(pattern)    --------->5 2. Match str.match(pattern) --------['js'] /js/g -----> ["js", "js",,"js"] match vs exec match:非全局的情况下才会返回分组中匹配到的内容,全局匹配

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

javascript学习笔记---ECMAScriptECMAScript 对象----修改对象

通过使用 ECMAScript,不仅可以创建对象,还可以修改已有对象的行为. prototype 属性不仅可以定义构造函数的属性和方法,还可以为本地对象添加属性和方法. 创建新方法 通过已有的方法创建新方法Number.prototype.toHexString = function() { return this.toString(16); }; 在此环境中,关键字 this 指向 Number 的实例,因此可完全访问 Number 的所有方法.有了这段代码,可实现下面的操作: var iNu

JavaScript学习笔记【2】表达式和运算符、语句、对象

笔记来自<JavaScript权威指南(第六版)> 包含的内容: 表达式和运算符 语句 对象 表达式和运算符 数组直接量中的列表逗号之间的元素可以省略,这时省略的空位会填充值undefined.元素列表末尾可以留下单个逗号,这时并不会创建一个新的值为undefined元素. 属性访问表达式,.identifier的写法只适用于要访问的属性名称是合法的标识符,并且需要知道要访问的属性的名字.如果属性名称是一个保留字或者包含空格和标识符,或是一个数字(对于数组来说),则必须使用方括号的写法.当属性

Java程序猿的JavaScript学习笔记(1——理念)

计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Java程

Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Ja