【フロントエンドの知識】JavaScript - 属性と属性

【フロントエンドの知識】JavaScript - 属性と属性

1. データの属性

データ属性には、データ値を保持する場所が含まれます。値はこの場所から読み取られ、この場所に書き込まれます。

データ属性の 4 つの特徴:

特性 説明する
[[設定可能]] プロパティを削除して削除によって再定義できるかどうか、そのプロパティを変更できるかどうか、およびアクセサー プロパティに変更できるかどうかを示します。
[[列挙可能]] 属性を for-in ループで返すことができるかどうかを示します。
[[書き込み可能]] プロパティの値を変更できるかどうかを示します。
[[価値]] プロパティの実際の値が含まれます
// 当我们创建一个对象时,name的值会被设置到 [[Value]]特性中,[[Configurable]]、[[Enumerable]]和[[Writable]] 都会被设置为 true
let person = {
    
     
 name: "Outman" 
};

プロパティのデフォルト値を変更する場合は、Object.defineProperty() メソッドを使用できます。

  1. 書き込み可能な属性を変更する
let person = {
    
    }; 
Object.defineProperty(person, "name", {
    
     
 writable: false, // 表示不可修改
 value: "Outman" 
}); 
console.log(person.name); // "Outman" 
person.name = "manOut";  // 尝试修改name属性
console.log(person.name); // "Outman",无法修改name值,因为 writable 为 false
  1. 構成可能な属性を変更する
let person = {
    
    }; 
Object.defineProperty(person, "name", {
    
     
 configurable: false, // 表示不可配置
 value: "Outman" 
}); 
console.log(person.name); // "Outman" 
delete person.name; // 尝试 delete name属性
console.log(person.name); // "Outman",无法delete name属性,因为 configurable 为 false

// 另外,值得一提的是,一个属性被定义为不可配置之后,将无法再变回可配置的!

2. アクセサーのプロパティ

getter 関数と setter 関数が含まれていますが、これら 2 つの関数は必須ではありません。

特性 説明する
[[設定可能]] 属性を削除して削除によって再定義できるかどうか、そのプロパティを変更できるかどうか、およびデータ属性に変更できるかどうかを示します。
[[列挙可能]] 属性を for-in ループで返すことができるかどうかを示します。
[[得る]] Getter 関数。プロパティが読み取られるときに呼び出されます。
[[セット]] プロパティが書き込まれるときに呼び出される Setter 関数。

アクセサー プロパティのプロパティも、Object.defineProperty() によって変更されます。

// 定义一个对象,包含伪私有成员 year_和公共成员 edition 
let book = {
    
     
    year_: 2017, 
    edition: 1
}; 
Object.defineProperty(book, "year", {
    
     
    get() {
    
     
        return this.year_; 
    }, 
    set(newValue) {
    
     
        if (newValue > 2017) {
    
     
            this.year_ = newValue; 
            this.edition += newValue - 2017; 
        } 
    } 
}); 
book.year = 2018; 
console.log(book.edition); // 2

3. 複数の属性を定義する

複数のプロパティを定義するには、Object.defineProperties() メソッドを使用できます。

let book = {
    
    }; 
Object.defineProperties(book, {
    
     
    year_: {
    
     
        value: 2017 
    }, 
    edition: {
    
     
        value: 1 
    }, 
    year: {
    
     
        get() {
    
     
            return this.year_; 
        },
        set(newValue) {
    
     
            if (newValue > 2017) {
    
     
                this.year_ = newValue; 
                this.edition += newValue - 2017; 
            } 
        } 
    } 
});

第四に、読み取りプロパティの特徴

プロパティのプロパティを読み取るには、Object.getOwnPropertyDescriptor() メソッドを使用できます。プロパティの複数のプロパティを読み取るには、ECMAScript 2017 で新しく追加された静的メソッド Object.getOwnPropertyDescriptors() を使用できます。このメソッドは、所有されている各プロパティに対して Object.getOwnPropertyDescriptor() を呼び出し、それらを新しいオブジェクトで返します。

let descriptor = Object.getOwnPropertyDescriptor(book, "year_"); 
console.log(descriptor.value); // 2017 
console.log(descriptor.configurable); // false 
console.log(typeof descriptor.get); // "undefined" 
let descriptor = Object.getOwnPropertyDescriptor(book, "year"); 
console.log(descriptor.value); // undefined 
console.log(descriptor.enumerable); // false 
console.log(typeof descriptor.get); // "function"

console.log(Object.getOwnPropertyDescriptors(book)); 
// { 
// edition: { 
// configurable: false, 
// enumerable: false, 
// value: 1, 
// writable: false 
// }, 
// year: { 
// configurable: false, 
// enumerable: false, 
// get: f(), 
// set: f(newValue), 
// }, 
// year_: { 
// configurable: false, 
// enumerable: false, 
// value: 2017, 
// writable: false 
// } 
// }

おすすめ

転載: blog.csdn.net/weixin_42919342/article/details/131980040