参考文章:

  1. MDN:getBoundingClientRect()
  2. MDN:Object.create()
  3. MDN:Object.defineProperty()

document.implementation

document.implementation返回一个和当前文档相关联的 DOMImplementation 接口(对象),DOMImplementation 可以提供了不依赖于任何 document 的方法。

DOMImplementation 没有继承任何的属性,它包含有四个方法:

  1. createDocument():创建一个新 Document 对象和指定的根元素;
  2. createDocumentType():创建空的 DocumentType 节点;
  3. createHTMLDocument():创建一个 HTML Document 对象;
  4. hasFeature():检查 DOMImplementation 是否可执行指定的特性和版本,返回一个布尔值。

示例:

  1. var imp = document.implementation;
  2. console.log(imp.hasFeature("HTML","1.0")); // 检查这个文件是否有HTML DOM 1.0功能

document.readyState

document.readyState属性描述了文档的加载状态,其返回值为一个表征状态的字符串,取值有以下几种:

  1. loading:文档加载中;
  2. interactive:文档已经完成加载,文档已被解析,但是诸如图像,样式表和框架之类的子资源仍在加载;
  3. complete:文档和所有子资源已完成加载,此状态表示 load 事件即将被触发。

每次状态的切换,便会触发一次 readystatechange 事件。

示例:

  1. // 一个简单的文档状态检查的定时器
  2. setInterval(function() {
  3. console.log(document.readyState);
  4. }, 10);

Element.getBoundingClientRect()

DOM 节点的getBoundingClientRect()方法返回一个矩形对象,包含四个属性: left、top、right 和 bottom。分别表示元素相对页面的各项数据。

示例:

  1. var divElem = document.getElementById('div');
  2. var coords = divElem.getBoundingClientRect();
  3. console.log(coords);

Object.defineProperty()

针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;是否可以被for..inObject.keys()遍历。给对象的属性添加特性描述,目前提供两种形式: 数据描述和存取器描述。

语法:

  1. Object.defineProperty(obj, prop, descriptor)

参数说明:

  1. obj:必需,目标对象;
  2. prop:必需,需定义或修改的属性的名字;
  3. descriptor:必需,目标属性所拥有的特性。

数据描述

  1. value:Any 类型,修改属性对应的值,示例如下:

    1. var data = { age: 10 };
    2. Object.defineProperty(data, 'age', {
    3. value: 100
    4. });
    5. console.log(data.age); // => 100
  2. writable:Boolean 类型,修改属性的可写性,示例如下:

    1. var data = { age: 10 };
    2. Object.defineProperty(data, 'age', {
    3. writable: false
    4. });
    5. data.age = 100;
    6. console.log(data.age); // => 10
  3. enumerable:Boolean 类型,修改属性的可枚举性,示例如下:

    1. var data = { age: 10, name: 'WJT20' };
    2. Object.defineProperty(data, 'age', {
    3. enumerable: false,
    4. });
    5. for (let key in data) {
    6. console.log(data[key]);
    7. }
    8. // => "WJT20"
  4. configurable:Boolean 类型,决定属性的前三项配置是否可以重新配置或被 delete 删除,示例如下:

    1. var data = { age: 10 };
    2. Object.defineProperty(data, 'age', {
    3. configurable: false,
    4. });
    5. delete data.age;
    6. console.log(data.age); // => 10

存取器描述

  1. getter:获得属性值的方法,获取属性值的时候触发 get 属性定义的方法,返回的值作为属性的新值,示例如下:

    1. var data = { age: 10 };
    2. Object.defineProperty(data, 'age', {
    3. get: function () {
    4. return 100;
    5. },
    6. });
    7. console.log(data.age); // => 100
  2. setter:设置属性值的方法,设置属性值的时候触发 set 属性定义的方法,示例如下:

    1. var data = { age: 10 };
    2. Object.defineProperty(data, 'age', {
    3. set: function (value) {
    4. data = value;
    5. },
    6. });
    7. data.age = 100;
    8. console.log(data); // => 100

注意:当使用了 getter 或 setter 方法,不允许使用 writable 和 value 这两个属性。

Object.freeze()

Object.freeze()方法可以冻结一个对象(包括数组),冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。

示例:

  1. var user = {
  2. id: 1,
  3. name: 'WJT20'
  4. };
  5. Object.freeze(user);
  6. user.name = 'Jerry'; // 严格模式下会直接抛出错误
  7. console.log(user.name); // => "WJT20"

判断一个对象是否被”冻结”,可以使用Object.isFrozen()方法:

  1. var user = {
  2. id: 1,
  3. name: 'WJT20'
  4. };
  5. console.log(Object.isFrozen(user)); // => false
  6. Object.freeze(user);
  7. console.log(Object.isFrozen(user)); // => true

Object.create()

Object.create()可以接收一个对象参数,并返回一个它的拷贝体,其语法规则如下:

  1. Object.create(proto, [propertiesObject])

参数说明:

  1. proto:必需,新创建对象的原型对象;
  2. propertiesObject:可选,需要传入一个对象,该对象的属性类型参照Object.defineProperties()的第二个参数。如果该参数被指定且不为 undefined,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。简单说就是为新对象附加 propertiesObject 对象的自有可枚举属性。