参考文章:
document.implementation
document.implementation
返回一个和当前文档相关联的 DOMImplementation 接口(对象),DOMImplementation 可以提供了不依赖于任何 document 的方法。
DOMImplementation 没有继承任何的属性,它包含有四个方法:
createDocument()
:创建一个新 Document 对象和指定的根元素;createDocumentType()
:创建空的 DocumentType 节点;createHTMLDocument()
:创建一个 HTML Document 对象;hasFeature()
:检查 DOMImplementation 是否可执行指定的特性和版本,返回一个布尔值。
示例:
var imp = document.implementation;
console.log(imp.hasFeature("HTML","1.0")); // 检查这个文件是否有HTML DOM 1.0功能
document.readyState
document.readyState
属性描述了文档的加载状态,其返回值为一个表征状态的字符串,取值有以下几种:
- loading:文档加载中;
- interactive:文档已经完成加载,文档已被解析,但是诸如图像,样式表和框架之类的子资源仍在加载;
- complete:文档和所有子资源已完成加载,此状态表示 load 事件即将被触发。
每次状态的切换,便会触发一次 readystatechange 事件。
示例:
// 一个简单的文档状态检查的定时器
setInterval(function() {
console.log(document.readyState);
}, 10);
Element.getBoundingClientRect()
DOM 节点的getBoundingClientRect()
方法返回一个矩形对象,包含四个属性: left、top、right 和 bottom。分别表示元素相对页面的各项数据。
示例:
var divElem = document.getElementById('div');
var coords = divElem.getBoundingClientRect();
console.log(coords);
Object.defineProperty()
针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;是否可以被for..in
或Object.keys()
遍历。给对象的属性添加特性描述,目前提供两种形式: 数据描述和存取器描述。
语法:
Object.defineProperty(obj, prop, descriptor)
参数说明:
- obj:必需,目标对象;
- prop:必需,需定义或修改的属性的名字;
- descriptor:必需,目标属性所拥有的特性。
数据描述
value:Any 类型,修改属性对应的值,示例如下:
var data = { age: 10 };
Object.defineProperty(data, 'age', {
value: 100
});
console.log(data.age); // => 100
writable:Boolean 类型,修改属性的可写性,示例如下:
var data = { age: 10 };
Object.defineProperty(data, 'age', {
writable: false
});
data.age = 100;
console.log(data.age); // => 10
enumerable:Boolean 类型,修改属性的可枚举性,示例如下:
var data = { age: 10, name: 'WJT20' };
Object.defineProperty(data, 'age', {
enumerable: false,
});
for (let key in data) {
console.log(data[key]);
}
// => "WJT20"
configurable:Boolean 类型,决定属性的前三项配置是否可以重新配置或被 delete 删除,示例如下:
var data = { age: 10 };
Object.defineProperty(data, 'age', {
configurable: false,
});
delete data.age;
console.log(data.age); // => 10
存取器描述
getter:获得属性值的方法,获取属性值的时候触发 get 属性定义的方法,返回的值作为属性的新值,示例如下:
var data = { age: 10 };
Object.defineProperty(data, 'age', {
get: function () {
return 100;
},
});
console.log(data.age); // => 100
setter:设置属性值的方法,设置属性值的时候触发 set 属性定义的方法,示例如下:
var data = { age: 10 };
Object.defineProperty(data, 'age', {
set: function (value) {
data = value;
},
});
data.age = 100;
console.log(data); // => 100
注意:当使用了 getter 或 setter 方法,不允许使用 writable 和 value 这两个属性。
Object.freeze()
Object.freeze()
方法可以冻结一个对象(包括数组),冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。
示例:
var user = {
id: 1,
name: 'WJT20'
};
Object.freeze(user);
user.name = 'Jerry'; // 严格模式下会直接抛出错误
console.log(user.name); // => "WJT20"
判断一个对象是否被”冻结”,可以使用Object.isFrozen()
方法:
var user = {
id: 1,
name: 'WJT20'
};
console.log(Object.isFrozen(user)); // => false
Object.freeze(user);
console.log(Object.isFrozen(user)); // => true
Object.create()
Object.create()
可以接收一个对象参数,并返回一个它的拷贝体,其语法规则如下:
Object.create(proto, [propertiesObject])
参数说明:
- proto:必需,新创建对象的原型对象;
- propertiesObject:可选,需要传入一个对象,该对象的属性类型参照
Object.defineProperties()
的第二个参数。如果该参数被指定且不为 undefined,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。简单说就是为新对象附加 propertiesObject 对象的自有可枚举属性。