Apply your JS skills to key Mozilla projects as an MDN Fellow! http://mzl.la/MDNFellowship

mozilla
Your Search Results

    defineProperties

    JavaScript 1.8.5 で導入

    概要

    オブジェクトで直接新しいプロパティを定義するか既存のプロパティを変更し、そのオブジェクトを返します。

    Method of Object
    Implemented in JavaScript 1.8.5
    ECMAScript Edition ECMAScript 5th Edition

    構文

    Object.defineProperties(obj, props)

    引数

    obj
    プロパティを定義または変更するオブジェクトです。
    props
    定義または変更するプロパティを構成する、列挙可能なプロパティのディスクリプタのオブジェクトです。

    説明

    本質的に Object.defineProperties、objrops オブジェクトの props で列挙可能な自身のプロパティに対応する、すべてのプロパティを定義します。

    使用例

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

    Polyfill

    すべての名前とプロパティが自身の初期値を参照する初期の実行環境を想定して、Object.defineProperties は以下の JavaScript による再実装とほぼ同等 (isCallable のコメントに注意) になっています:

    function defineProperties(obj, properties)
    {
      function convertToDescriptor(desc)
      {
        function hasProperty(obj, prop)
        {
          return Object.prototype.hasOwnProperty.call(obj, prop);
        }
    
        function isCallable(v)
        {
          // 注意: 関数以外の値が呼び出し可能である場合、必要に応じてそれを変更します。
          return typeof v === "function";
        }
    
        if (typeof desc !== "object" || desc === null)
          throw new TypeError("bad desc");
    
        var d = {};
        if (hasProperty(desc, "enumerable"))
          d.enumerable = !!obj.enumerable;
        if (hasProperty(desc, "configurable"))
          d.configurable = !!obj.configurable;
        if (hasProperty(desc, "value"))
          d.value = obj.value;
        if (hasProperty(desc, "writable"))
          d.writable = !!desc.writable;
        if (hasProperty(desc, "get"))
        {
          var g = desc.get;
          if (!isCallable(g) && g !== "undefined")
            throw new TypeError("bad get");
          d.get = g;
        }
        if (hasProperty(desc, "set"))
        {
          var s = desc.set;
          if (!isCallable(s) && 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;
    }
    

    ブラウザの互換性

    Kangax's compat tables に基づきます。

    機能 Firefox (Gecko) Chrome Internet Explorer Opera Safari
    基本サポート 4.0 (2) 5 (前のバージョンではテストされていません) 9 11.60 5
    機能 Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
    基本サポート 4.0 (2) (有) ? 11.50 (有)

    参考情報

    ドキュメントのタグと貢献者

    Contributors to this page: ethertank, yyss
    最終更新者: ethertank,