Heim >Web-Frontend >js-Tutorial >JavaScript-objektorientierte detaillierte Analyse von Eigenschaftsdeskriptoren
Dieser Artikel vermittelt Ihnen relevantes Wissen über Javascript. Er stellt hauptsächlich verwandte Themen zur Objektorientierung vor, einschließlich Attributdeskriptoren, Datendeskriptoren, Zugriffsdeskriptoren usw. Ich hoffe, es hilft allen.
【Verwandte Empfehlungen: Javascript-Video-Tutorial, Web-Frontend】
JavaScript unterstützt tatsächlich eine Vielzahl von Programmierparadigmen, einschließlich funktionaler Programmierung und objektorientierter Programmierung :
var obj = new Object() obj.name = 'why' console.log(obj.name, obj) // why { name: 'why' }
// 字面量方式 var obj2 = { name: 'jam', age: '8' } console.log(obj) // { name: 'jam', age: '8' }
Vorher wurden unsere Eigenschaften direkt innerhalb des Objekts definiert oder dem direkt hinzugefügt innerhalb des Objekts;
Auf diese Weise können wir diesem Attribut jedoch keine Einschränkungen auferlegen: Kann dieses Attribut beispielsweise durch delect
gelöscht werden und kann es während for-in durchlaufen werden?
Durchquerung? delect
删除,是否可以在 for-in
遍历的时候被遍历出来呢?
如果我们想要对一个属性进行比较精准的操作控制,那么我就可以使用 属性描述符。通过属性描述符可以精准的添加或修改对象的属性;
属性描述符需要使用 Object.defineProperty
来对属性进行添加或修改。
属性描述符分为两种:数据描述符和存取描述符
数据描述符是一个具有值的属性,该值可能是可写的,也可能是不可写的。数据描述符具有以下可选键值:
Object.getOwnPropertyDescriptor()方法返回指定对象上一个自有属性对应的属性描述符。
Object.getOwnPropertyDescriptor(obj,prop)
注意:如果该方法的第一个参数不是对象,会报错(TypeError)。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
Object.defineProperty(obj,prop,descriptor)
如下示例代码展示了属性描述符的设置和获取 var obj = { name: 'jam', age: 8 } Object.defineProperty(obj, 'job', { value: '律师' }) console.log(Object.getOwnPropertyDescriptor(obj, 'age')) // { value: 8, writable: true, enumerable: true, configurable: true } console.log(obj.job) // 律师 // 通过defineProperty新增的属性,该新属性是不可修改、不可删除以及不可枚举的 console.log(Object.getOwnPropertyDescriptor(obj, 'job')) // {value: '律师',writable: false,enumerable: false,configurable: false}
verwenden. Die Eigenschaften eines Objekts können durch Eigenschaftsdeskriptoren genau hinzugefügt oder geändert werden.Attributdeskriptor
注意:通过defineProperty新增的属性,该新属性是不可修改、不可删除以及不可枚举的
Wenn wir eine genauere operative Kontrolle über ein Attribut haben möchten, kann ich den
Object.defineProperty
verwenden, um Eigenschaften hinzuzufügen oder zu ändern.
Attributdeskriptoren werden in zwei Typen unterteilt: Datendeskriptoren und Zugriffsdeskriptoren
2.1 Datendeskriptor
Ein Datendeskriptor ist ein Attribut mit einem Wert. Der Wert kann sein beschreibbar oder unbeschreiblich. Der Datendeskriptor verfügt über die folgenden optionalen Schlüsselwerte:
konfigurierbar: Nur wenn das Konfigurierbare des Attributs wahr ist, kann der Attributdeskriptor geändert werden und das Attribut kann auch aus dem entsprechenden Objekt gelöscht werden. Der Standardwert ist falsch.
aufzählbar: Nur wenn die Aufzählung des Attributs wahr ist, kann das Attribut im Aufzählungsattribut des Objekts erscheinen. Der Standardwert ist falsch.
var obj = { name: 'jam', age: 8 } Object.defineProperty(obj, 'address', { value: '河北', // configurable 该属性不可删除,更不可再次使用defineProperty修改属性描述符 configurable: false, }) delete obj.address // 想使用delete删除该属性 obj.address = '广州' // 想修改obj中的属性address值为广州 console.log(obj.address) // 输出结果:河北obj: Das zu findende Zielobjekt 🎜🎜prop: Der Name des Attributs im Zielobjekt (String-Typ). 🎜🎜Rückgabewert: Wenn die angegebene Eigenschaft für das Objekt vorhanden ist, wird ihr Eigenschaftsdeskriptorobjekt zurückgegeben, andernfalls wird undefiniert zurückgegeben. 🎜🎜🎜🎜Hinweis: Wenn der erste Parameter dieser Methode kein Objekt ist, wird ein Fehler (TypeError) gemeldet. 🎜🎜🎜2.1.2. Legen Sie den Eigenschaftsdeskriptor Object.defineProperty fest🎜
🎜Die Methode Object.defineProperty() definiert direkt eine neue Eigenschaft für ein Objekt oder ändert eine vorhandene Eigenschaft eines Objekts und Dieses Objekt zurückgeben. 🎜var obj = { name: 'jam', age: 8}Object.defineProperty(obj, 'sex ', { value: '男', // enumerable 配置该属性是否可以枚举 enumerable: true})for (i in obj) { console.log(i)}🎜🎜obj: Das Objekt, für das die Eigenschaften definiert werden sollen. 🎜🎜prop: Der Name der Eigenschaft, die definiert oder geändert werden soll. 🎜🎜descriptor: Der zu definierende oder zu ändernde Eigenschaftsdeskriptor 🎜🎜Rückgabewert: Das an die Funktion übergebene Objekt 🎜🎜var obj = { name: 'jam', age: 8}Object.defineProperty(obj, 'score', { value: 80, // writable: true writable: false})obj.score = 100 console.log(obj.score) // 80🎜🎜Hinweis: Die über defineProperty hinzugefügte neue Eigenschaft kann nicht geändert oder gelöscht werden und ist nicht aufzählbar🎜🎜🎜🎜(1) Ob konfigurierbar auf dem Objekt gelöscht werden kann🎜🎜<pre class="brush:php;toolbar:false">Object.defineProperties(obj,props)</pre>🎜🎜Da der konfigurierbare Wert des Attributdeskriptors falsch ist und nicht gelöscht oder geändert werden kann, werden Löschung und Änderung nicht wirksam🎜🎜 🎜🎜( 2) Ob enumerable aufgezählt und durchlaufen werden kann🎜🎜<pre class="brush:php;toolbar:false">var obj = { name: 'jam',}Object.defineProperties(obj, { 'age': { value: 28, writable: true, configurable: false, enumerable: true }, 'job': { value: '律师', writable: true, configurable: false, enumerable: true }, 'sex': { value: '男', writable: false, configurable: false, enumerable: true }, 'height': { value: '1.8 m', writable: false, configurable: false, enumerable: true }})console.log(obj) // name: 'jam', age: 28, job: '律师', sex: '男', height: '1.8m' }</pre>🎜🎜Wenn enumerable: false, ist das Ausgabeergebnis Name Alter🎜 Wenn enumerable: true, ist das Ausgabeergebnis Name Alter Geschlecht🎜🎜🎜🎜 (3) beschreibbar Diese Funktion steuert, ob Diesem Attribut kann ein Wert zugewiesen werden (einen Wert schreiben)
是不是感觉每次只能设置一个属性的属性描述符很繁琐,Object.defineProperties可以帮你解决问题。
Object.defineProperties()方法为对象定义一个或多个新属性或修改现有属性,并返回该对象。
Object.defineProperties(obj,props)
示例代码如下:
var obj = { name: 'jam',}Object.defineProperties(obj, { 'age': { value: 28, writable: true, configurable: false, enumerable: true }, 'job': { value: '律师', writable: true, configurable: false, enumerable: true }, 'sex': { value: '男', writable: false, configurable: false, enumerable: true }, 'height': { value: '1.8 m', writable: false, configurable: false, enumerable: true }})console.log(obj) // name: 'jam', age: 28, job: '律师', sex: '男', height: '1.8m' }
存取描述符是由getter-setter函数对描述的属性。存取描述符具有以下可选键值:
configurable 和 enurnerable 的使用与数据描述符中的一致,这里就不过多讲解了。
主要讲一下get 和 set 方法的使用
var obj = { name: 'jam', age: 8, _address: '河北' } // 存取描述符的使用场景 // 1.隐藏某一个私有属性被希望直接被外界使用和赋值 // 2.如果我们希望解惑某一个属性它访问和设置值的过程时,也会使用存储属性描述符 Object.defineProperty(obj, 'address', { enumerable: true, configurable: true, get: function () { foo() return this._address }, set: function (value) { bar() this._address = value } }) function foo () { console.log("截获了一次address的值") } function bar () { console.log("设置了一次address的值") }
上述示例代码控制台打印结果如下:
【相关推荐:javascript视频教程、web前端】
Das obige ist der detaillierte Inhalt vonJavaScript-objektorientierte detaillierte Analyse von Eigenschaftsdeskriptoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!