ホームページ ウェブフロントエンド jsチュートリアル JavaScriptオブジェクトのデータ属性とアクセサ属性の詳細説明

JavaScriptオブジェクトのデータ属性とアクセサ属性の詳細説明

Jul 09, 2020 pm 03:00 PM
javascript 物体

JavaScriptオブジェクトのデータ属性とアクセサ属性の詳細説明

オブジェクトを作成するには 2 つの方法があります。1 つは new 演算子の後に Object コンストラクターを使用する方法、もう 1 つはオブジェクト リテラル メソッドを使用する方法です。以下のように

var person = new Object();
person.name = 'Nicy';
person.age = 21;
person.sayName = function() {
    console.log(this.name);
};        
var person = {
    name: 'Nicy',
    age: 21,
    sayName: function() {
        console.log(this.name);
    }
}
ログイン後にコピー

これらの 2 つのメソッドで作成されるオブジェクトは同じであり、同じプロパティとメソッドを持ちます。これらのプロパティには、その動作を説明する内部プロパティ記述子があります。

Object.defineProperty()

Object.defineProperty() を通じて、オブジェクトにプロパティを直接作成したり、既存のプロパティを変更したりできます. 属性。

Object.defineProperty(obj, prop, descriptor) は 3 つのパラメータを受け取ります:

obj: プロパティが配置されているオブジェクト

prop: プロパティの名前accessed

記述子: 記述子オブジェクト

記述子オブジェクトには、構成可能、列挙可能、書き込み可能、​​値、取得、設定の 6 つのプロパティが含まれています。プロパティの特性を変更するには、オブジェクトを使用する必要があります。 defineProperty() メソッド。

上記の 2 つのメソッドで追加されたオブジェクト プロパティの Boolean プロパティのデフォルト値は true です。Object.defineProperty を通じてプロパティ プロパティを変更する場合は、変更する必要があるプロパティのみを設定します。オブジェクト経由 .defineProperty によって作成されたプロパティには、デフォルト値が false のブール属性があります。

ECMAScript には、データ プロパティとアクセサー プロパティの 2 種類のプロパティがあります。

データ属性

データ属性には 4 つの属性記述子が含まれます:

[[構成可能]]: プロパティを再定義するかどうかを示します。プロパティのプロパティは変更できますか? プロパティをアクセサー プロパティに変更できますか?上記の方法で追加されたオブジェクトのプロパティは、デフォルトで true に設定されます。

[[Enumerable]] : for-in ループを通じてプロパティにアクセスできるかどうかを示します。上記の方法で追加されたオブジェクトのプロパティは、デフォルトで true に設定されます。

[[Writable]] : 属性の値を変更できるかどうかを示します。上記の方法で追加されたオブジェクトのプロパティは、デフォルトで true に設定されます。

[[値]]: この属性のデータ値が含まれており、読み取りと書き込みが可能です。上記の方法で追加されたオブジェクトのプロパティは、デフォルトでは未定義です。

Writable

var person = {};

Object.defineProperty(person, "name", {
    value: 'Nicy'
})
person.name = 'Lee';  
console.log(person.name)    // 'Nicy'

Object.defineProperty(person, "name", {
    writable: true
})
person.name = 'Lee';
console.log(person.name)    // 'Lee'
ログイン後にコピー

Object.defineProperty によって直接作成された書き込み可能なプロパティはデフォルトが false で、値を変更できません。このとき、名前は Lee に変更されます。非厳密モードでは使用できません。エラーが報告されますが、操作は無視されます。厳密モードでは、エラーが報告されます。

Configurable

<span style="font-size: 13px;"><span style="color: #0000ff;"></span>var person = {<br>    name: 'Nicy',<br>    age: 21,<br>    sayName: function() {<br>        console.log(this.name);<br>    }<br>}<br><br>Object.defineProperty(person, "name", {<br>    configurable: false<br>})<br><br>delete person.name;    // 操作被忽略,无法通过delete删除属性<br>Object.defineProperty(person, "name", {    // throw error<br>    configurable:true    <br>})     <br>Object.defineProperty(person, "name", {    // throw error<br>    enumerable: false<br>})  <br>Object.defineProperty(person, "name", {     // 由于writable为true,所以可以修改value<br>    value: 'Lucy'<br>})console.log(person.name)    // Lucy<br>Object.defineProperty(person, "name", {    // writable可进行true -> false的单向修改<br>    writable: false<br>})<br>Object.defineProperty(person, "name", {     // throw error<br>    value: 'Lee'<br>})<br>Object.defineProperty(person, "name", {    // throw error,此时writable不可以false -> true<br>    writable: true<br>})<span style="color: #000000;"></span></span>
ログイン後にコピー

configurable を要約すると、configurable が false に設定されている場合、

1. 削除によって属性を削除して再定義することはできません。プロパティ;

2. アクセサー プロパティに変換できません;

3. Configurable および enumerable は変更できません;

4. writable は一方向に変更できますfalse に設定されますが、false から true に変更することはできません。;

5. 値を変更できるかどうかは、writable に依存します。

configurable が false の場合、属性を削除するには delete を使用します。非厳密モードでは、エラーは報告されませんが、操作は無視されます。厳密モードでは、エラーが報告されます。他の機能が無効な場合、変更できないものを変更すると、エラーが報告されます。

Enumerable

enumerable は、オブジェクトのプロパティを for...in および Object.keys() で列挙できるかどうかを示します。

var person = {};
Object.defineProperty(person, "a", { value : 1, enumerable:true });
Object.defineProperty(person, "b", { value : 2, enumerable:false });
Object.defineProperty(person, "c", { value : 3 }); // enumerable defaults to false
person.d = 4; // 如果使用直接赋值的方式创建对象的属性,则这个属性的enumerable默认为true

for (var i in person) {    
  console.log(i);  
}  //  'a' 和 'd' 

Object.keys(person); // ["a", "d"]
ログイン後にコピー

アクセサー プロパティ

アクセサー プロパティには 4 つのプロパティ記述子が含まれます:

[[Configurable]]: 属性がdelete で属性を削除することで再定義できるか、属性の特性を変更できるかどうか、および属性をデータ属性に変更できるかどうかを確認します。オブジェクトに直接定義されたプロパティのデフォルトは true です。

[[Enumerable]] : for-in ループを通じてプロパティにアクセスできるかどうかを示します。オブジェクトに直接定義されたプロパティのデフォルトは true です。

[[Get]]: プロパティの読み取り時に呼び出される関数。デフォルトは未定義です。

[[Set]]: プロパティの書き込み時に呼び出される関数。デフォルトは未定義です。

var person = {
    name: 'Nicy',
    _age: 21,
    year: 1997,
    _year: 1997,
    sayName: function() {
        console.log(this.name);
    }
}

Object.defineProperty(person, "age", {
    get: function() {
        return this._age;
    },
    set: function(value) {
        this._age = value;
                // ...
    }
})
ログイン後にコピー

Object.defineProperty() で定義されたアクセサー プロパティには、設定可能で列挙可能なデフォルトが false に設定されています。

#データ プロパティとアクセサー プロパティ間の変換

##Object.getOwnPropertyDescriptor プロパティの読み取り

Object.getOwnPropertyDescriptor を使用してプロパティ記述子を取得します:

Object.getOwnPropertyDescriptor(obj, prop)

obj: プロパティが配置されているオブジェクト;

Prop: 名前アクセスするプロパティの。

データ属性-> アクセサー属性

属性属性は、既存のデータに対して、アクセサー記述子とデータ記述子のいずれか 1 つだけにすることができます。プロパティと get または set が指定されている場合、アクセサー プロパティに変換されると、そのプロパティの値と書き込み可能値は破棄されます。

次のコードは、オブジェクトの元のデータ属性 year をアクセサー属性に変換します。

*注: アクセサー属性の取得および設定では、これを使用してアクセサー属性を使用することはできません。プロパティ自体にアクセスします。そうでない場合、無限再帰が発生し、メモリ リークが発生します。

// 设置get和set其中任意一个即可转换为访问器属性
Object.defineProperty(person, "year", {
    get: function() {
//        return this,year;    // error
        return this._year;    
    },
    set: function(value) {
//             this.year = value;  // error
        this._year= value;
    }
})

var descriptor = Object.getOwnPropertyDescriptor(person, 'year');
console.log(descriptor);    // {get: ƒ, set: ƒ, enumerable: true, configurable: true}
ログイン後にコピー
元のデータ属性 year で、Object.defineProperty() を使用して属性の get または set を設定します。これはアクセサー属性に変換できます。

アクセサー プロパティ -> データ プロパティ

将访问器属性转换为数据属性,只需要给现有访问器属性设置value或writable这两个属性描述符中的任意一个即可,其原有的get和set就会被废弃,从而转换为数据属性。

上面为person定义的访问器属性age,通过Object.defineProperty()只设置了get和set,所以configurable默认为false,不可以将其转换为数据属性。可以在访问器属性和数据属性间相互转化的属性其configurable特性值必须为true。

如下代码,我们为person新定义一个访问器属性job,将其configurable设置为true ,并将其转换为数据属性:

Object.defineProperty(person, "job", {
    configurable: true,
    enumerable: true,
    get: function() {
        return this._job;
    },
    set: function(value) {
        this._job = value;
    }
})

// 设置value和writable其中任意一个即可转换为数据属性        
Object.defineProperty(person, "job", {
    value: 'worker',
    writable: true
})

var descriptor = Object.getOwnPropertyDescriptor(person, 'job');
console.log(descriptor);    // {value: "worker", writable: true, enumerable: true, configurable: true}
ログイン後にコピー

数据描述符value、writable 和访问器描述符get、set不能同时设置,否则会报错。

Object.defineProperties()

通过Object.defineProperties()可以一次性为对象定义多个属性。

var person = {};
Object.defineProperties(person, {
  name: {
    value: 'Nicy',
    writable: true
  },
  _age: {
    value: 21,
    enumerable: true,
    writable: true,
    configurable: true
  },
   age: {
    get: function() {
    return this._age;
    },
    set: function(value) {
    this._age = value;
    }
  }
});
ログイン後にコピー

 相关教程推荐:JavaScript视频教程

以上がJavaScriptオブジェクトのデータ属性とアクセサ属性の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

MySQLクエリ結果の配列をオブジェクトに変換するにはどうすればよいですか? MySQLクエリ結果の配列をオブジェクトに変換するにはどうすればよいですか? Apr 29, 2024 pm 01:09 PM

MySQL クエリ結果の配列をオブジェクトに変換する方法は次のとおりです。 空のオブジェクト配列を作成します。結果の配列をループし、行ごとに新しいオブジェクトを作成します。 foreach ループを使用して、各行のキーと値のペアを新しいオブジェクトの対応するプロパティに割り当てます。新しいオブジェクトをオブジェクト配列に追加します。データベース接続を閉じます。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

PHP における配列とオブジェクトの違いは何ですか? PHP における配列とオブジェクトの違いは何ですか? Apr 29, 2024 pm 02:39 PM

PHP では、配列は順序付けられたシーケンスであり、要素はインデックスによってアクセスされます。オブジェクトは、new キーワードによって作成されたプロパティとメソッドを持つエンティティです。配列へのアクセスはインデックス経由で、オブジェクトへのアクセスはプロパティ/メソッド経由で行われます。配列値が渡され、オブジェクト参照が渡されます。

PHP 関数はどのようにオブジェクトを返すのでしょうか? PHP 関数はどのようにオブジェクトを返すのでしょうか? Apr 10, 2024 pm 03:18 PM

PHP 関数は、return ステートメントに続いてオブジェクト インスタンスを使用してオブジェクトを返すことにより、データをカスタム構造にカプセル化できます。構文: functionget_object():object{}。これにより、カスタム プロパティとメソッドを使用してオブジェクトを作成し、オブジェクトの形式でデータを処理できるようになります。

C++ 関数がオブジェクトを返すときは何に注意する必要がありますか? C++ 関数がオブジェクトを返すときは何に注意する必要がありますか? Apr 19, 2024 pm 12:15 PM

C++ では、関数がオブジェクトを返すときに注意する点が 3 つあります。 オブジェクトのライフサイクルは、メモリ リークを防ぐために呼び出し元によって管理されます。ぶら下がりポインタを回避し、動的にメモリを割り当てるかオブジェクト自体を返すことにより、関数が戻った後もオブジェクトが有効なままであることを確認します。コンパイラーは、パフォーマンスを向上させるために、返されたオブジェクトのコピー生成を最適化する場合がありますが、オブジェクトが値セマンティクスによって渡される場合、コピー生成は必要ありません。

PHP の Request オブジェクトとは何ですか? PHP の Request オブジェクトとは何ですか? Feb 27, 2024 pm 09:06 PM

PHP の Request オブジェクトは、クライアントからサーバーに送信される HTTP リクエストを処理するために使用されるオブジェクトです。 Request オブジェクトを通じて、リクエストを処理して応答するために、リクエスト メソッド、リクエスト ヘッダー情報、リクエスト パラメータなどのクライアントのリクエスト情報を取得できます。 PHP では、$_REQUEST、$_GET、$_POST などのグローバル変数を使用して、要求された情報を取得できますが、これらの変数はオブジェクトではなく配列です。リクエスト情報をより柔軟かつ便利に処理するために、次のことができます。

See all articles