参考文章:
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)); // => falseObject.freeze(user);console.log(Object.isFrozen(user)); // => true
Object.create()
Object.create()可以接收一个对象参数,并返回一个它的拷贝体,其语法规则如下:
Object.create(proto, [propertiesObject])
参数说明:
- proto:必需,新创建对象的原型对象;
- propertiesObject:可选,需要传入一个对象,该对象的属性类型参照
Object.defineProperties()的第二个参数。如果该参数被指定且不为 undefined,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。简单说就是为新对象附加 propertiesObject 对象的自有可枚举属性。
