Object.defineProperty && Object.defineProperties
ときに内部特性のみ使用定義ECMAS-262第5版、いくつかのプロパティの特性の記述を提供します。ECMAScriptのオブジェクトの既存の属性記述子2つのメインデータ記述子(属性データ)とアクセス記述子(アクセスプロパティ)があり、データ記述子が書き込み可能か、書き込み不可属性値であります。アクセスディスクリプタは、本明細書に記載のゲッターセッター関数関数の組の属性です。
Object.defineProperty && Object.defineProperties
これらの2つの方法JSにおいて重要である、主な機能がされている内部のプロパティを定義または変更するために使用される、対応それがObject.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptors
取得され、このライン内部プロパティ。
データ(データ記述子)のプロパティ
4つのデータの属性がありますが特徴の内部プロパティを記述
[[設定可能]
プロパティのプロパティ、またはアクセス属性変更のプロパティを変更する機能を変更することができ、属性を削除することによって除去されるかどうかを示す、直接リテラル定義オブジェクト場合、デフォルトはtrueです[列挙]]
)(のためのインループ又はObject.keys属性を返すかどうか、つまり、属性が列挙できるかどうかを示す、直接リテラル定義オブジェクト場合、デフォルトは真であります[書き込み可能]]
プロパティの値を変更することができ、直接リテラル定義オブジェクト場合、デフォルトはtrueです[値]
属性値デフォルトに対応する定義されていません
アクセサ(アクセス記述子)の特性
アクセス特性はまた、4つの内部プロパティ特性を有する説明しました
[コンフィグレーション]
データと特性は[[構成可能]、削除する削除することによりこのプロパティは、プロパティのプロパティ、またはアクセス属性変更のプロパティを変更する能力を変更できるかどうかを示す、リテラル定義として使用される場合のようにオブジェクトは、デフォルト値はtrueです[列挙]
と属性がデフォルト、リテラル定義オブジェクトとして使用される場合、)(のためのインループ又はObject.keys属性を返すかどうか、すなわち、列挙可能かどうかを示すように、データは、[構成可能]を]属性それは本当です[[プレゼント]
未定義だった何ゲッターがない場合、ゲッター方法を提供するプロパティ(オブジェクトのプロパティにアクセスするための関数呼び出しが、戻り値はプロパティの現在の値です)。戻り値は、メソッドの属性値として使用されます。デフォルトは定義されていません[設定]
ないセッターが未定義なかった場合プロパティは、セッターメソッド(属性値が対象に提供されたときに呼び出される関数)を提供します。この方法は、ユニークなパラメータ、および属性に割り当てられたパラメータの新しい値をとります。デフォルトは定義されていません
作成/修正/プロパティメソッドを取得します
- Object.defineProperty()
機能:
この方法は、新しい属性に直接オブジェクトを定義する、またはオブジェクトの既存のプロパティを変更し、オブジェクトを返します。あなたは、設定可能な書き込み可能な、列挙を指定しない場合、これらの属性のデフォルト値がfalseであるあなたは、値を指定して取得し、設定しない場合、これらのプロパティのデフォルト値が定義されていません
语法: Object.defineProperty(obj, prop, descriptor)
OBJ:ターゲットオブジェクトを操作する
小道具:ターゲットが定義または属性の名前変更する必要がある
記述子を属性が定義されたかの記述子を変更されます。
var obj = new Object();
Object.defineProperty(obj, 'name', {
configurable: false,
writable: true,
enumerable: true,
value: '张三'
})
- Object.defineProperties()
機能:
直接オブジェクト上の1つまたは複数の新しい属性を定義したり、既存の属性を変更する方法、およびオブジェクトを返します。
语法: Object.defineProperties(obj, props)
OBJ:オブジェクトの属性を追加または変更する
小道具オブジェクトの1つの以上のキーが追加またはオブジェクトに対して定義された特定の構成属性を変更します。
var obj = new Object();
Object.defineProperties(obj, {
name: {
value: '张三',
configurable: false,
writable: true,
enumerable: true
},
age: {
value: 18,
configurable: true
}
})
console.log(obj.name, obj.age) // 张三, 18
- Object.getOwnPropertyDescriptor()
機能:
このメソッドは、独自の属性記述子の対応するプロパティの指定されたオブジェクトを返します。(付与手段自身のプロパティは、属性がプロトタイプチェーンからルックアップする必要はなく、オブジェクトの直接のプロパティです)
语法: Object.getOwnPropertyDescriptor(obj, prop)
OBJ:ターゲットオブジェクトを見つける必要性
ターゲットオブジェクトのプロパティの名前:小道具を
var person = {
name: '张三',
age: 18
}
var desc = Object.getOwnPropertyDescriptor(person, 'name');
console.log(desc) 结果如下
// {
// configurable: true,
// enumerable: true,
// writable: true,
// value: "张三"
// }
- Object.getOwnPropertyDescriptors()
機能:
無属性自体が存在しない場合は、すべて自分の属性記述子指定されたオブジェクトは、空のオブジェクトを返します。
语法: Object.getOwnPropertyDescriptors(obj)
OBJ:ターゲットオブジェクトを見つける必要
var person = {
name: '张三',
age: 18
}
var desc = Object.getOwnPropertyDescriptors(person);
console.log(desc)
//name: {
// configurable: true,
// enumerable: true,
// value: '张三',
// writable: true
//}
//age: {
configurable: true
enumerable: true
value: 18
writable: true
}
様々なシナリオの下で記述子のプロパティ
- 設定可能
falseに設定可能な属性は、delete演算子(strictモードではエラーを投げる)を使用することができない場合は、すべての内部プロパティは、エラーをスロー変更「はJavaScriptの高度なチュートリアル、」今だけ書き込み可能の値を変更することができましたエラーがスローされます書き込み可能の値を変更
オブジェクト内の記述子属性データを追加します。
var person = {};
Object.defineProperty(person, 'name', {
configurable: false,
value: 'John'
}) ;
delete person.name // 严格模式下抛出错误
console.log(person.name) // 'John' 没有删除
Object.defineProperty(person, 'name', {
configurable: true //报错
});
Object.defineProperty(person, 'name', {
enumerable: 2 //报错
});
Object.defineProperty(person, 'name', {
writable: true //报错
});
Object.defineProperty(person, 'name', {
value: 2 //报错
});
オブジェクト記述子の属性にアクセスを追加します。
var obj = {};
var aValue; //如果不初始化变量, 不给下面的a属性设置值,直接读取会报错aValue is not defined
var b;
Object.defineProperty(obj, 'a', {
configurable : true,
enumerable : true,
get: function() {
return aValue
},
set: function(newValue) {
aValue = newValue;
b = newValue + 1
}
})
console.log(b) // undefined
console.log(obj.a) // undefined, 当读取属性值时,调用get方法,返回undefined
obj.a = 2; // 当设置属性值时,调用set方法,aValue为2
console.log(obj.a) // 2 读取属性值,调用get方法,此时aValue为2
console.log(b) // 3 再给obj.a赋值时,执行set方法,b的值被修改为2,额外说一句,vue中的计算属性就是利用setter来实现的
注:
1.getterセッターと同時に使用するのではなく、厳密モードの一方のみ、エラーがスローされ
、データ・アクセス記述子2.記述子を混合することができず、エラーが発生し
var obj = {};
Object.defineProperty(obj, 'a', {
value: 'a1',
get: function() {
return 'a2'
}
});
地球環境3.
var a = 1; // a属于window, 相当于window.a
var d = Object.getOwnPropertyDescriptor(window, 'a');
console.log(d)
// {
// configurable: false,
// value: 1,
// writable: true,
// enumerable: true
// }
別では、変数を初期化する方法NA VAR文を見て
a = 1; // a相当于window的一个属性, window.a
var d = Object.getOwnPropertyDescriptor(window, 'a');
console.log(d)
// {
// configurable: true, // 此时configurable属性值为true
// value: 1,
// writable: true,
// enumerable: true
// }
設定可能な属性値がfalseであるVARは、上記で定義された変数は、オブジェクトは次のように定義されます
var b = {
name: 'bbb'
}
var d = Object.getOwnPropertyDescriptor(window, 'b');
console.log(d)
// {
// configurable: false
// value: 1,
// writable: true,
// enumerable: true
// }
記述子属性が真であるオブジェクト内の属性データのリテラル定義を使用して、オブジェクトであることに留意されたいです
var b = {
name: 'bbb'
}
var d = Object.getOwnPropertyDescriptor(b, 'name');
console.log(d)
// {
// configurable: true
// writable: true,
// enumerable: true
// value: 'bbb'
// }
- 書き込み可能
書き込み可能が偽(真として設定可能)である場合、[値]のDefinePropertyによって修飾することができるが、直接割り当てを変更することはできません