Javascript属性属性
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"
上面的代码生成以下结果。
![](https://atts.w3cschool.cn/attachments/jimg/javascript_object_oriented/RETRIEVING_PROPERTY_ATTRIBUTES__B7F992FD47845A2B244D.png)
防止对象修改
上面的代码生成以下结果。...
[[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
上面的代码生成以下结果。
![](https://atts.w3cschool.cn/attachments/jimg/javascript_object_oriented/PREVENTING_EXTENSIONS__CB31859239DF22E3EFA6.png)
尝试向不可扩展对象添加属性将在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
上面的代码生成以下结果。
![](https://atts.w3cschool.cn/attachments/jimg/javascript_object_oriented/SEALING_OBJECTS__8599D1A2979B5B9B052E.png)
上面的代码生成以下结果。...
冻结对象
创建不可扩展对象的最后一种方法是冻结它。
创建不可扩展对象的最后一种方法是冻结它。...
冻结对象是一个密封对象,其中数据属性也是只读的。
冷冻物品冻结后不能冻结。
我们可以通过使用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
上面的代码生成以下结果。
![](https://atts.w3cschool.cn/attachments/jimg/javascript_object_oriented/FREEZING_OBJECTS__8F2A02D6ACEB5C08C9C4.png)
更多建议: