読者です 読者をやめる 読者になる 読者になる

takafumi blog

日々の勉強メモ

javascript プロパティ属性

環境   CentOS 7.0 JavaScript

今までJavaScriptはきちんと勉強せず感覚で使っていなあ、とよく思う今日この頃。


プロパティ属性

オブジェクトの持つプロパティには、以下の属性を設定できる。

名前 役割
value
writable 書き込み可
enumerable 列挙可
configurable 再定義可
get 取得
set 設定

アクセッサである、get,setにも属性を設定できるが、writableは指定できない。

"use strict";

// 1プロパティずつ設定
p1 = {};
Object.defineProperty(p1, "x", { value : 1,
                                 writable: false,
                                 enumerable: false,
                                 configurable: false,
                                 get r(){return this.x;},
                                 set r(newvalue){return this.x = newvalue;},
});

// まとめて設定2
var p2 = Object.defineProperties({}, {
    x: { value: 1, writable: true, enumerable:true,  configurable:true },
    y: { value: 1, writable: true, enumerable:false, configurable:false},
    r: {
        get: function() { return this.x + this.y; },
        set: function(newvalue) { this.x = newvalue; this.y = this.x * 2; },
        enumerable:false,
        configurable:true
    }
});

p1,p2のオブジェクトの私方が違うが、どちらのメソッドもどちらでも設定可能。

この状態で、writable = false, configuable = falseになっているところに変更をかけると、

p1.x = 2;    // TypeError: Cannot assign to read only property 'x' of #<Object
delete p1.x; // TypeError: Cannot delete property 'x' of #<Object

のようにTypeErrorが発生する(strictのときのみ)。

またenumerableは

console.log(Object.keys(p2)); // [ 'x' ]

のようにfalseだと列挙できなくなる。

get,setは説明不要と思うが、

console.log(p2.r); // 2
p2.r = 2;
console.log(p2.r); // 6

となる。