资讯专栏INFORMATION COLUMN

JavaScript深入理解对象方法——Object.defineProperties()

jk_v1 / 1104人阅读

摘要:方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。默认为当且仅当在枚举相应对象上的属性时该属性显现。函数返回值将被用作属性的值。默认为返回值传递给函数的对象。

Object.defineProperties()

Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。

语法

Object.defineProperties(obj, props)

参数

obj
在其上定义或修改属性的对象。

props
要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器描述符(更多详情,请参阅Object.defineProperty())。描述符具有以下键:

configurable
true 当且仅当该属性描述符的类型可以被改变并且该属性可以从对应对象中删除。默认为 false

enumerable
true 当且仅当在枚举相应对象上的属性时该属性显现。默认为 false

value
与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)。默认为 undefined.

writable
true当且仅当与该属性相关联的值可以用assignment operator改变时。默认为 false

get
作为该属性的 getter 函数,如果没有 getter 则为undefined。函数返回值将被用作属性的值。默认为 undefined

set
作为属性的 setter 函数,如果没有 setter 则为undefined。函数将仅接受参数赋值给该属性的新值。默认为 undefined

返回值

传递给函数的对象。

描述

Object.defineProperties本质上定义了obj 对象上props的可枚举属性相对应的所有属性。

例子
var obj = {};
Object.defineProperties(obj, {
  "property1": {
    value: true,
    writable: true
  },
  "property2": {
    value: "Hello",
    writable: false
  }
  // etc. etc.
});
Polyfill

假设一个原始的执行环境,所有的名称和属性都引用它们的初始值,Object.defineProperties几乎完全等同于(注意isCallable中的注释)以下JavaScript中的重新实现:

function defineProperties(obj, properties) {
  function convertToDescriptor(desc) {
    function hasProperty(obj, prop) {
      return Object.prototype.hasOwnProperty.call(obj, prop);
    }

    function isCallable(v) {
      // NB: modify as necessary if other values than functions are callable.
      return typeof v === "function";
    }

    if (typeof desc !== "object" || desc === null)
      throw new TypeError("bad desc");

    var d = {};

    if (hasProperty(desc, "enumerable"))
      d.enumerable = !!desc.enumerable;
    if (hasProperty(desc, "configurable"))
      d.configurable = !!desc.configurable;
    if (hasProperty(desc, "value"))
      d.value = desc.value;
    if (hasProperty(desc, "writable"))
      d.writable = !!desc.writable;
    if (hasProperty(desc, "get")) {
      var g = desc.get;

      if (!isCallable(g) && typeof g !== "undefined")
        throw new TypeError("bad get");
      d.get = g;
    }
    if (hasProperty(desc, "set")) {
      var s = desc.set;
      if (!isCallable(s) && typeof s !== "undefined")
        throw new TypeError("bad set");
      d.set = s;
    }

    if (("get" in d || "set" in d) && ("value" in d || "writable" in d))
      throw new TypeError("identity-confused descriptor");

    return d;
  }

  if (typeof obj !== "object" || obj === null)
    throw new TypeError("bad obj");

  properties = Object(properties);

  var keys = Object.keys(properties);
  var descs = [];

  for (var i = 0; i < keys.length; i++)
    descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);

  for (var i = 0; i < descs.length; i++)
    Object.defineProperty(obj, descs[i][0], descs[i][1]);

  return obj;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89131.html

相关文章

  • 深入理解JavaScript中的属性和特性

    摘要:深入理解中的属性和特性中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解中的属性和特性。其中第三个参数描述符对象是对象字面量的方法创建的,里面的属性和属性值实际上保存的是要修改的特性和特性值。 深入理解JavaScript中的属性和特性   JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性。   主...

    VPointer 评论0 收藏0
  • JavaScript深入理解对象方法——Object.create()

    摘要:语法新创建对象的原型对象。返回值在指定原型对象上添加新属性后的对象。例外如果参数不是或一个对象,则抛出一个异常。是在引入的,且可用。请注意,尽管在中支持设置为为,但因为那些以前版本限制,此无法支持该特性。 Object.create() Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象。 语法 Object.create(proto[, propert...

    melody_lql 评论0 收藏0
  • 深入理解ES6笔记(六)Symbol与Symbol属性

    摘要:先搜索全局符号注册表,如果已有,则返回这个已存在的符号值否则,会创建一个新的符号值,并使用该键值将其记录到全局符号注册表中,然后返回这个新的符号值。 主要知识点:创建符号值、使用符号值、共享符号值、符号值转换。检索符号值属性以及知名符号 showImg(https://segmentfault.com/img/bVbfWhK?w=1203&h=633); 《深入理解ES6》笔记 目录 ...

    crossea 评论0 收藏0
  • javascript 面向对象版块之定义多个对象属性以及读取属性特性

    摘要:返回值是一个对象,如果是访问器属性,这个对象的属性有和如果是数据属性,这个对象的属性有和。上一篇面向对象版块之对象属性下一篇面向对象版块之创建对象 这是 javascript 面向对象版块的第三篇文章,主要讲解的是多个属性的定义以及读取属性的特性。前面这几章内容目的在于加深对对象的理解,这样可以利于理解后面的原型链以及继承方面的知识,或者你也可以了解一下不一样的 javascript ...

    wendux 评论0 收藏0
  • 深入了解JavaScript对象(2)--函数、对象

    摘要:属性是函数独有的,表明该对象可以被执行。李四张三张三李四李四李四张三属性探测由于属性可以在任何时候添加,所以有时候就有必要检查对象是否已有一个属性。张三属性特征通过方法来改变属性特征。 1.[[Call]]属性是函数独有的,表明该对象可以被执行。由于仅函数拥有该对象,ECMAScript定义typeof操作符对任何具有[[Call]]属性的对象返回function。 注:某些浏览器曾经...

    darkerXi 评论0 收藏0

发表评论

0条评论

jk_v1

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<