Javascript 属性类型

由 alexbro 创建,youj 最后一次修改 2017-01-06

Javascript面向对象设计 - Javascript属性类型


有两种不同类型的属性:数据属性和访问器属性。

数据属性包含一个值,如book1的name属性。

访问器属性不包含值。

访问器属性只需要一个getter或setter。

有一种特殊的语法来使用对象字面量来定义访问器属性:

var book1 = { 
   _name : "Javascript", 
/*  www.w3cschool.cn*/
   get name() { 
        console.log("Reading name"); 
        return this._name; 
    }, 
   set name(value) { 
        console.log("Setting name to %s", value); 
        this._name = value; 
    } 
}; 

console.log(book1.name); 

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

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

在访问器属性名称之前使用特殊关键字 get set

Getters应该返回一个值。
设置器接收分配给属性的值作为参数。
我们不需要定义getter和setter,我们可以选择一个或两个。
如果只定义一个getter,那么该属性将变为只读,并且尝试写入该属性将在nonstrict模式下静默失败,并在严格模式下抛出一个错误。
如果仅定义setter,那么属性将变为只写,并且尝试读取该值将在严格和非严格模式下静默失败。


属性

Javascript可以直接与属性属性交互。
我们可以添加新属性以支持其他功能。
我们可以创建表现与内置JavaScript属性相同的属性。

公共属性

在数据和访问器之间共享两个属性属性属性。

一个是[[Enumerable]],它决定是否可以迭代。

另一个是[[Configurable]],它确定属性是否可以更改。

我们可以使用 delete 删除可配置属性并可以随时更改其属性。

默认情况下,我们在对象上声明的所有属性都是可枚举和可配置的。

我们可以使用 defineProperty 方法来更改 [[Enumerable]] [[Configurable]]

var book1 = { 
   name : "Javascript" 
}; 

Object.defineProperty(book1, "name", { 
   enumerable : false 
}); 

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

var properties = Object.keys(book1); 
console.log(properties.length);                      // 0 

Object.defineProperty(book1, "name", { 
    configurable : false 
}); 

// try to delete the Property 
delete book1.name; 
console.log("name" in book1);                      // true 
console.log(book1.name);                           // "Javascript" 

//Object.defineProperty(book1, "name", {           // error!!! 
//    configurable : true 
//}); 

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

当JavaScript以严格模式运行时,尝试删除不可配置的属性导致错误。

在非严格模式下,操作会静默失败。



以上内容是否对您有帮助:

二维码
建议反馈
二维码