Javascript面向对象的设计 - JavaScript访问器属性属性

2018-01-06 19:14 更新

Javascript面向对象的设计 - JavaScript访问器属性属性


访问器属性有两个附加属性。

因为没有为存取器属性存储值,所以不需要[[Value]]或[[Writable]]。

相反,访问器有[[Get]]和[[Set]],它们分别包含getter和setter函数。

我们只需要定义这些属性之一来创建属性。如果我们只定义[[Get]]属性是可读的,或者我们可以使用[[Set]]来设置属性可写。

如果您尝试创建具有数据和访问器属性的属性,您将获得一个错误。

通过使用访问器属性属性而不是对象我们可以定义的文字符号现有对象上的那些属性。

要使用对象字面符号,我们必须在创建对象时定义访问器属性。

我们可以指定访问器属性是可配置还是可枚举。



例子

下面的代码


var book1 = { 
    _name : "Javascript", 
/*from   w  w w.j a va 2 s .c  om*/
    get name() { 
        console.log("Reading name"); 
        return this._name; 
    }, 

    set name(value) { 
        console.log("Setting name to %s", value); 
        this._name = value; 
    } 
}; 

可以写成:


var book1 = { 
    _name : "Javascript" 
}; /*from   w w w  .j  a  va  2  s .  c  o  m*/

Object.defineProperty(book1, "name", { 
    get : function() { 
        console.log("Reading name"); 
        return this._name; 
    }, 
    set : function(value) { 
        console.log("Setting name to %s", value); 
        this._name = value; 
    }, 
    enumerable : true, 
    configurable : true 
}); 


例子...

设置其他属性([[Ienumerable]]和[[Configurable]])允许您可以更改评估者属性的工作原理。

我们可以创建一个不可配置,不可数,不可写的属性,如下所示:


var book1 = { 
    _name : "Javascript" 
}; /*w w w .  ja v a 2s. co m*/
Object.defineProperty(book1, "name", { 
    get : function() { 
        console.log("Reading name"); 
        return this._name; 
    } 
}); 

console.log("name" in book1);                      // true 
console.log(book1.propertyIsEnumerable("name"));   // false 
delete book1.name; 
console.log("name" in book1);                      // true 

book1.name = "CSS"; 
console.log(book1.name);                           // "Javascript" 

上面的代码生成以下结果。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号