この記事では、JavaScript の Object.defineProperty() メソッドの分析を紹介します。必要な方は参考にしてください。
JavaScript オブジェクトのプロパティを追加または変更するには、 = assign を直接使用する または Object.defineProperty() を使用して定義する という 2 つの異なる方法があります。以下の通りです:
// 示例1 var obj = {}; // 直接使用=赋值 obj.a = 1; // 使用Object.defineProperty定义 Object.defineProperty(obj, "b", { value: 2 }); console.log(obj) // 打印"{a: 1, b: 2}"
こうして見ると、両者に違いはないようですね。ただし、Object.getOwnPropertyDescriptor() を使用して obj.a および obj.b のプロパティの記述子 (プロパティ記述子) を表示すると、 = が Object.defineProperty と同じではないことがわかります。 = assign を使用すると、属性の属性記述子値を変更でき、writable、enumerable、configurable がすべて true であることがわかります。
Object.defineProperty() を使用して定義されたプロパティの書き込み可能、列挙可能、および構成可能なプロパティ記述子のデフォルト値は false ですが、それらはすべて変更できます。 writable、enumerable、configurable の意味については、名前から推測するのは難しくありません。これについては後で詳しく紹介します。
= assign を使用することは、Object.defineProperty() を使用して定義するときに writable、enumerable、configurable を true に設定することと同じです。コード例 3 と 4 は同等です:
// 示例2 var obj = {}; obj.a = 1; Object.defineProperty(obj, "b", { value: 2 }); console.log(Object.getOwnPropertyDescriptor(obj, "a")); // 打印"{value: 1, writable: true, enumerable: true, configurable: true}" console.log(Object.getOwnPropertyDescriptor(obj, "b")); // 打印"{value: 2, writable: false, enumerable: false, configurable: false}"
// 示例3 var obj = {}; obj.name = "Fundebug"; console.log(Object.getOwnPropertyDescriptor(obj, "name")); // 打印{value: "Fundebug", writable: true, enumerable: true, configurable: true}
Object.defineProperty()
// 示例4 var obj = {}; Object.defineProperty(obj, "name", { value: "Fundebug", writable: true, enumerable: true, configurable: true }); console.log(Object.getOwnPropertyDescriptor(obj, "name")); // 打印{value: "Fundebug", writable: true, enumerable: true, configurable: true}
// 示例5 var obj = {}; Object.defineProperty(obj, "name", { value: "Fundebug" }); console.log(Object.getOwnPropertyDescriptor(obj, "name")); // 打印{value: "Fundebug", writable: false, enumerable: false, configurable: false}
writable、enumerable、および configurable がすべて false であるため、obj.name 属性を割り当て、走査、および削除することはできません:
// 示例6 var obj = {}; Object.defineProperty(obj, "name", { value: "Fundebug", writable: false, enumerable: false, configurable: false }); console.log(Object.getOwnPropertyDescriptor(obj, "name")); // 打印{value: "Fundebug", writable: false, enumerable: false, configurable: false}
strict モード (「use strict」) の場合、以下例 7 のコードでは、以下に示すエラーが報告されます。
writable
(同様のアプリケーション エラーをリアルタイムで監視したい場合は、 Fundebug を無料でお試しいただけます。フロントエンド Web ページ、WeChat ミニ プログラム、WeChat ミニ ゲーム、Node.js、Java エラー監視をサポートしています ): // 示例7
var obj = {};
Object.defineProperty(obj, "name",
{
value: "Fundebug"
});
// writable为false,无法赋值
obj.name = "云麒";
console.log(obj.name); // 打印"Fundebug"
// enumerable为false,无法遍历
console.log(Object.keys(obj)); // 打印"[]"
// configurable为false,无法删除
delete obj.name;
console.log(obj.name); // 打印"Fundebug"
enumerable
// 示例8 "use strict" var obj = {}; Object.defineProperty(obj, "name", { value: "Fundebug", writable: false, enumerable: true, configurable: true }); obj.name = "云麒"; // 报错“Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'”
enumerable が true の場合、属性は走査できます。読者はこれを自分でテストできます。
configurable
// 示例9 "use strict" var obj = {}; Object.defineProperty(obj, "name", { value: "Fundebug", writable: true, enumerable: false, configurable: true }); console.log(Object.keys(obj)) // 打印"[]"
// 示例10 "use strict" var obj = {}; Object.defineProperty(obj, "name", { value: "Fundebug", writable: true, enumerable: true, configurable: false }); delete obj.name // 报错“Uncaught TypeError: Cannot delete property 'name' of #<Object>”
js でのクラス拡張とオブジェクト指向の技術分析
angularjs ページ テンプレートのクリアの使用方法について
以上がJavaScript の Object.defineProperty() メソッドの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。