面向对象的程序设计之对象

*** 创建一个Object的实例 然后添加属性和方法 ** var person = new Object();person name = "LXK ";p
/**
     *  创建一个Object的实例 然后添加属性和方法 
     **/
    var person = new Object();
    person.name = "LXK";
    person.age = "12";
    person.sayAge = function() {
        return this.age;
    };

    /**
     *  面向字面量的方法  等价于上面的代码
     **/
     var person = {
         name: "LXK",
         age : "12",

         sayAge : funtion() {
             return this.age;
         }
     };

ECMAScript 中有两种属性: 数据属性 和访问器属性
数据属性 和访问器属性 不能直接定义 只能通过Object.defineProperty()方法来定义


数据属性包含一个数据值的位置 这个位置可以读取和写入值 数据属性有4钟特性

[[configurable]]: 默认值为true 

[[Enumerable]]: 表示能否通过for-in循环返回属性  默认值为true 

[[Writable]]:表示能否修改属性的值  默认值为true  默认值为false的时候 表示只读 不可修改

[[Value]]:包含这个属性的数据值 从这个位置读取 和写入保存  默认值为 undefined

var p1 = {
 name :"LXK"
};

这个对象的[[Value]]被设置为LXK 这个值得任何修改都将反应在这个位置

修改默认属性必须使用Object.defineProperty(p1, "age", {})方法。三个参数 属性所在的对象 属性名  一个描述符对象 描述符对象的属性必须是:configurable enumerable writable value 

var p1 = {};
Object.defineProperty(p1, "name", {
 writable:false,
 value:"LXK"
})
console.log(p1.name) // "LXK"  ;
p1.name = "lxk";
console.log(p1.name) //"LXK"

//writable:false  表示写入的值只可以读取 不可以修改

 

以上规则也是用于不可配置属性 (configurable)

var p1 = {};
Object.defineProperty(p1, "name", {
 configurable: false,
 value: "LXK";
});
p1.name // "LXK";
delete p1.name // false;
p1.name // "LXK";

不可配置属性(configurable)一但被设置为false 就不可以在给变成可配置了 在调用Object.defineProperty()方法修改writable之外的属性都会导致错误

笔记:IE8以上可以使用Object.defineProperty()方法

访问器属性:访问器属性不包含数据值;他们包含一对getter setter 函数(这两个函数不必须) 在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性的时候,会调用setter属性并传入新值,这个函数决定如何处理数据。  访问器属性有四个特性。

[[configurable]]

[[Enumerable]]

[[Get]]:在读取属性时调用的函数  默认值undefined  p1.name //"LXK"  读取

[[Set]] :在写入属性时调用的函数 默认值undefined   p1.name = "LXK"  写入

var book = {
 _year : 2004,
 edition:1
};
Object.defineProperty(book, "year", {
 get: function(){
   return this._year;
 },
 set: function(newYear){
    if(newYear > 2004){
      this._year = newYear;
      this.edition += newYear - 2004;
    }     
 },
});
book.year = 2005;
console.log(book.edition);
var book = {};
Object.defineProperties(book,{
  _year: {
    writable: true,
    value: 2004
  },
  
  edition: {
    writable: true,
    value: 1
  },

  year : {
    get: function(){
      return this._year;
    },

    set: function(newYear){
if( newYear > 2004){ this._year = newYear; this.edtion += newYear - 2004; } } } });

 

 

 

Object.defineProperty()