Javascript Object.defineProperty()

Javascript作为同一种语言,有个美誉,开发者可以另行定义任何工作。虽然当时在过去之一对javascript可以,但是ECMAScript5惨遭早已起取改变,例如,我们可采用Object.defineProperty创建一个未能够于修改的目标的性能。本文中我们用叙Object.defineProperty的基本用法。
如果你想当篇章开始前,深入了解Object.defineProperty方法,请戳。

无异于、基本用法

万一我想构建一个math.js库,看下的实例:

var mathObj = {
    constants: {
        "pi": 3.14
    },
    areaOfCircle: function(radius) {
        return this.constants.pi*radius*radius;
    }
} 

每当上例中,如果有人改pi的值,那么我们拿无会见博得不错的测算结果,虽然有过多法好化解者问题,但是最好简便的道是使pi属性不可写。看下实例:

var mathObj = {
    constants: {},
    areaOfCircle: function(radius) {
        return this.constants.pi*radius*radius;
    }
} 

Object.defineProperty(mathObj.constants, "pi", {
    value: 3.14,
    writable: false
});

mathObj.constants.pi = "Benjamin";

//Outputs: 3.14
console.log(mathObj.constants.pi);

Object.defineProperty(obj, prop,
descriptor)方法接收三个参数:需要添加或修改属性的对象,属性名称,属性描述options。从上例可以望,当为pi赋值为“Benjamin”时,最后输出的价值还是3.14。
但是要是吃math.js使用“use strict”,将会见报错,和于undefined赋值一样:

"use strict";
var mathObj = {
    constants: {},
    areaOfCircle: function(radius) {
        return this.constants.pi*radius*radius;
    }
} 

Object.defineProperty(mathObj.constants, "pi", {
    value: 3.14,
    writable: false
});

mathObj.constants.pi = "Benjamin";

//Outputs: Uncaught TypeError: Cannot assign to read only property 'pi' of #<Object> 
console.log(mathObj.constants.pi);

其三单参数的options中,writable默认值为false,所以在上例中可大概,configurable默认值为false,如果你想使用你的堆栈底用户故意重写pi的价值,你可以安装configurable值为true。

Object.defineProperty(principia.constants, "pi", {
    value: 3.14,
    configurable: true
});

只是当您以Object.defineProperty时,也发出同一种相当好的Hack,即使设置了writable的值,它吧无见面保持属性值不更换的:

var container = {};

Object.defineProperty(container, "arr", {
    writable: false,
    value: ["a", "b"]
});

container.arr = ["new array"];

// Outputs: ["a", "b"]
console.log(container.arr);

container.arr.push("new value");

// Outputs: ["a", "b", "new value"]
console.log(container.arr);

arr数组是不可写的,所以一直对同一个勤组,但是数组的积极分子是好生成之,所以用来或许会见增多锁定数组或者目标来化解这问题。

 

二、兼容性

盖Object.defineProperty方法是ES5的一致片段,所以在IE9及当代浏览器,IE8中只落了部分实现,尽可以使用以DOM对象上,不幸之是,并不曾IE8相关的shim来配合。但是,如果你切莫待处理旧的浏览器,defineProperty可能会见产生你使用的地方。
以上就是对准Object.defineProperty方法的讲述,文中不妥的远在,还于批评指正。