Javascript属性属性

2018-01-06 19:14 更新

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


检索属性属性

要获取属性属性,请使用Object.getOwnPropertyDescriptor()。

此方法仅适用于自己的属性。

此方法接受两个参数:要处理的对象和要检索的属性名称。

如果属性存在,您应该接收一个描述符对象有四个属性:可配置,可枚举,并且两个其他适合于属性的类型。

例如,以下代码创建一个属性并检查其属性:


var book1 = { 
    name : "Javascript" 
}; // w  ww. j  a va2 s  . c  o m

var descriptor = Object.getOwnPropertyDescriptor(book1, "name"); 

console.log(descriptor.enumerable);     // true 
console.log(descriptor.configurable);   // true 
console.log(descriptor.writable);       // true 
console.log(descriptor.value);          // "Javascript" 

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



防止对象修改

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

[[Extensible]]属性是一个布尔值,指示对象本身是否可以修改。

我们创建的所有对象默认都是可扩展的,这意味着可以在任何时候向对象添加新属性。

通过将[[Extensible]]设置为false,我们可以防止新的属性添加到对象。

有三种不同的方法来完成这个。

防止扩展

创建不可扩展对象的一种方法是使用Object.preventExtensions()方法。

创建不可扩展对象的一种方法是使用Object.preventExtensions()方法。...

在对象上使用这个方法后,我们永远不会再次向其中添加任何新属性。

我们可以使用Object.isExtensible()检查[[Extensible]]的值。

我们可以使用Object.isExtensible()检查[[Extensible]]的值。...


var book1 = { 
    name : "Javascript" 
}; /* w ww  .ja v  a 2s.  c  om*/

console.log(Object.isExtensible(book1));      // true 

Object.preventExtensions(book1); 
console.log(Object.isExtensible(book1));      // false 

book1.writeLine = function() { 
     console.log(this.name); 
}; 

console.log("writeLine" in book1);              // false 

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

尝试向不可扩展对象添加属性将在strict中抛出错误模式。

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



密封对象

创建不可扩展对象的第二种方式是密封对象。

密封对象不可扩展,其所有属性都是不可配置的。

我们不能向对象添加新属性,我们不能删除属性或更改其类型。

如果对象被密封,您只能读取和写入其属性。

我们可以在对象上使用Object.seal()方法来封装它。

调用Object.seal()方法后,[[Extensible]]属性设置为false,并且所有属性的[[Configurable]]属性设置为false。

我们可以使用Object.isSealed()来检查对象是否被密封,如下所示:


var book1 = { 
    name : "Javascript" 
}; // w w  w.  j  a v a 2  s. c o  m

console.log(Object.isExtensible(book1));      // true 
console.log(Object.isSealed(book1));          // false 

Object.seal(book1); 
console.log(Object.isExtensible(book1));      // false 
console.log(Object.isSealed(book1));          // true 

book1.writeLine = function() { 
    console.log(this.name); 
}; 

console.log("writeLine" in book1);              // false 

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

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

var descriptor = Object.getOwnPropertyDescriptor(book1, "name"); 
console.log(descriptor.configurable);           // false 

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

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

冻结对象

创建不可扩展对象的最后一种方法是冻结它。

创建不可扩展对象的最后一种方法是冻结它。...

冻结对象是一个密封对象,其中数据属性也是只读的。

冷冻物品冻结后不能冻结。

我们可以通过使用Object.freeze()来冻结对象,并确定是否通过使用Object.isFrozen()冻结对象。

例如:


var book1 = { 
    name : "Javascript" 
}; /* w  w w  .ja  v a  2s  .co  m*/

console.log(Object.isExtensible(book1));      // true 
console.log(Object.isSealed(book1));          // false 
console.log(Object.isFrozen(book1));          // false 

Object.freeze(book1); 
console.log(Object.isExtensible(book1));      // false 
console.log(Object.isSealed(book1));          // true 
console.log(Object.isFrozen(book1));          // true 

book1.writeLine = function() { 
    console.log(this.name); 
}; 

console.log("writeLine" in book1);              // false 

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

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

var descriptor = Object.getOwnPropertyDescriptor(book1, "name"); 
console.log(descriptor.configurable);           // false 
console.log(descriptor.writable);               // false 

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

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

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号