Heim  >  Artikel  >  Web-Frontend  >  Einführung in die Verwendung von Object.defineProperty in JS (Codebeispiel)

Einführung in die Verwendung von Object.defineProperty in JS (Codebeispiel)

不言
不言nach vorne
2019-03-15 17:12:212365Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in die Verwendung von Object.defineProperty in JS (Codebeispiele). Ich hoffe, dass er für Sie hilfreich ist.

In JavaScript fügen Sie die Eigenschaften eines Objekts häufig über die folgenden Methoden hinzu oder ändern sie:

obj.name = 'John'

Darüber hinaus können Sie die Eigenschaften eines Objekts auch über die Object.defineProperty hinzufügen oder ändern ()-Methode. Noch wichtiger ist, dass die Methode zusätzlich zum Zielobjekt obj und dem Eigenschaftsnamen prop auch den Eigenschaftsdeskriptor übergeben kann, um komplexere Eigenschaften zu erreichen. Ein Attributdeskriptor ist ein Objekt, das in zwei Formen vorliegt: die eine ist ein Datendeskriptor und die andere ist ein Zugriffsdeskriptor.

Object.defineProperty(obj, prop, descriptor)

Datendeskriptor

Der Datendeskriptor unterstützt die folgenden Funktionen:

aufzählbar: Gibt an, ob das Objekt aufgezählt werden kann. Der Standardwert ist false, was bedeutet, dass diese Eigenschaft nicht in for...in und Object.keys() aufgezählt werden kann und sich auch auf JSON.stringify() auswirkt.

konfigurierbar: Gibt an, ob die Objektattribute gelöscht werden können und ob andere Attribute außer Wert und beschreibbaren Attributen geändert werden können. Der Standardwert ist „false“, was bedeutet, dass das Attribut nicht gelöscht und die Merkmale nicht geändert werden können.

Wert: Der dem Attribut entsprechende Wert, der Standardwert ist undefiniert.

schreibbar: Der Standardwert ist „false“, was bedeutet, dass es schreibgeschützt ist und dieser Eigenschaft keinen Wert zuweisen kann. Im strikten Modus führt die Zuweisung eines Werts zu einer schreibgeschützten Eigenschaft zu einem Fehler. Im entspannten Modus wird die Zuweisung von Werten zu schreibgeschützten Eigenschaften nicht wirksam.

// 示例1,等同于 obj.name = 'John'
var obj = {}
Object.defineProperty(obj, 'name', { 
  value: 'John',
  writable: true,
  configerable: true,
  enumerable: true
})

// 示例2,将 name 属性设置为只读
'use strict'
var obj = {}
Object.defineProperty(obj, 'name', {
  value: 'John',
  writable: false,
  configerable: true,
  enumerable: true
})
obj.name = 'Joy'  // TypeError

// 示例3,将 name 属性设置为不可枚举
var obj = {}
Object.defineProperty(obj, 'name', { 
  value: 'John',
  writable: true,
  configerable: true,
  enumerable: false
})
console.log(obj.name)  // John
console.log(Object.keys(obj))  // []

// 示例4,将 name 属性设置不可配置(不可删除,除value和writable特性外的其它特性不可被修改)
var obj = {}
Object.defineProperty(obj, 'name', { 
  value: 'John',
  writable: true,
  configerable: false,
  enumerable: true
})
delete obj.name  // false
Object.defineProperty(obj, 'name', { enumerable: false })  // TypeError

Speicherdeskriptor

Der Speicherdeskriptor unterstützt die folgenden Funktionen:

aufzählbar: Wie oben.

konfigurierbar: Wie oben.

set: Legen Sie die Setter-Methode fest. Wenn ein Attribut geändert wird, wird diese Methode mit dem neuen Attributwert als Parameter ausgeführt. Der Standardwert ist undefiniert.

get: Legen Sie die Getter-Methode fest, die ausgeführt wird, wenn auf die Eigenschaft zugegriffen wird. Der Standardwert ist undefiniert.

// 示例5,使用 get 和 set,计数属性读写的次数
var obj = {}, name = '', count1 = 0, count2 = 0
Object.defineProperty(obj, 'name', { 
  get: function () { 
    console.log('Read ' + (++count1) + ' times')
    return name
  },
  set: function (newVal) {
    console.log('Write ' + (++count2) + ' times')
    name = newVal
  }
})
obj.name  // Read 1 times
obj['name']  // Read 2 times
obj.name = 'Joy'  // Write 1 times
obj.name = 'Jack'  // Write 2 times

Hinweise

Darüber hinaus sind drei Punkte zu beachten: Erstens können Attribute mit zwei unterschiedlichen Deskriptoren nicht gemeinsam genutzt werden; zweitens werden die Merkmale, die nicht übergeben werden, nicht gemeinsam genutzt Auf den Standardwert gesetzt, und wenn die Eigenschaften geändert werden, bleiben die nicht eingeführten Eigenschaften wie folgt:

Object.defineProperty(obj, 'name', { value: 'John' })
// 属性是只读,不可配置,且不可枚举的。等同于
Object.defineProperty(obj, 'name', { 
  value: 'John',
  writable: false,
  configerable: false,
  enumerable: false
})

obj.name = 'John'
// 属性可写的,可配置的,可枚举的。等同于
Object.defineProperty(obj, 'name', { 
  value: 'John',
  writable: true,
  configerable: true,
  enumerable: true
})

Praktische Anwendung

Zum Beispiel gibt es ein Objekt Student , das zwei Attribute hat: Name und Alter. Wenn Sie nicht möchten: Was soll ich tun, wenn das Alter zu hoch oder zu niedrig eingestellt ist? Wir können eine Setter- und Getter-Methode hinzufügen. Jedes Mal, wenn wir das Alter ändern möchten, können wir das Attribut über die Setter-Methode ändern und das Attribut über die Getter-Methode lesen:

function Student (name, age) {
  this.name = name
  this.setAge = function (val) { 
    age = val
    if (age < 0) age = 0
    if (age > 100) age = 100
  }
  this.getAge = function () { return age }
}

var s = new Student('John', 16)
s.setAge(25)
console.log(s.getAge())  // 25
s.setAge(-5)
console.log(s.getAge())  // 0
s.setAge(500)
console.log(s.getAge())  // 100

Es scheint schön, aber jedes Mal Das Attribut wird gelesen oder geändert. Die Setter- oder Getter-Methode wird einmal aufgerufen, was viel Code hinzufügt. Mit der Object.defineProperty-Methode ist kein zusätzlicher Code erforderlich und die Eigenschaften können direkt auf die primitivste Weise gelesen und geändert werden:

function Student (name, age) {
  this.name = name
  var _age = age
  Object.defineProperty(this, 'age', {
    get: function () { return _age },
    set: function (val) {
      _age = val
      if (_age < 0) _age = 0
      if (_age > 100) _age = 100
    }
  })
}

var s = new Student('John', 16)
s.age = 25
console.log(s.age)  // 25
s.age = -5
console.log(s.age)  // 0
s.age = 500
console.log(s.age)  // 100

Stapelverarbeitung

Die Object.defineProperties()-Methode können in Stapeln hinzugefügt oder geändert werden. Attribute:

var obj = {}
Object.defineProperties(obj, {
  name: { value: 'John', emunerable: true },
  age: { value: 20, emunerable: true }
})

Die Methode Object.create() kann beim Erstellen von Objekten Attribute in Stapeln hinzufügen:

var obj = Object.create(Object.prototype, {
  name: { value: 'John', emunerable: true },
  age: { value: 20, emunerable: true } 
})

Sie können auch Objekte erstellen, die Setter- und Getter-Attribute enthalten Literale:

var obj = {
  get name() {
    return 'John'
  },
  set name(val) {
    console.log(val)
  },
  get age() {
    return 18
  }
}

Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von Object.defineProperty in JS (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen