2016-11-19 4 views
0

Ich habe ein Szenario, in dem ich eine property von class mit Object.defineProperty() ändern muss. Ich weiß, dass es durch die get() der descriptor getan werden kann.Object.defineProperty() innerhalb des Getters

Wenn Sie das Beispiel unten sehen, versuche ich eine function zurückgeben, die beim Aufruf einen Wert von this zurückgibt.

Meine Frage ist, muss ich , dass property wieder für die this Objekt? Ist es nötig? Wenn ja, warum?

Wenn ich eine Eigenschaft zu einer Klasse definieren, wird this auch das gleiche Recht widerspiegeln?

Ich kam durch this und ich bin neugierig zu wissen, warum er das tut.

class A { 
 
    constructor() { 
 
    this.h = 'hello world' 
 
    } 
 
    hello() {} 
 
} 
 

 
const des = Object.getOwnPropertyDescriptor(A.prototype, 'hello') 
 

 
Object.defineProperty(A.prototype, 'hello', { 
 
    configurable: true, 
 
    get: function(){ 
 
    //is this necessary 
 
    Object.defineProperty(this, 'hello', { 
 
     configurable: true, 
 
     value:() => this.h, 
 
    }) 
 
    //      
 
    return() => this.h 
 
    } 
 
}) 
 

 
const n = new A() 
 

 
console.log(n.hello())

+0

Warum nicht nur diese Eigenschaft außerhalb von Getter definieren? Ihr aktueller Code definiert bei jedem Zugriff auf den Prototyp eine neue Eigenschaft. –

+0

@ SoftwareEngineer171 Außerhalb des Getters erhalten Sie 'this' nicht –

+0

Sie erhalten nicht' this', wenn Sie Pfeilfunktionen verwenden. Stattdessen sollten Sie Standardfunktionen verwenden, damit Sie sie an Ihre Instanz (oder Ihren Prototyp) binden und auf die Instanz "this" zugreifen können. –

Antwort

1

Ich habe keine Ahnung, warum diese Person dies zu tun ist. Ich würde es wahrscheinlich nicht tun. Aber wenn Ihre Frage ist, ob es einen Unterschied darin gibt oder nicht, ist die Antwort ja.

class A { 
 
    constructor() { 
 
    this.h = 'hello world' 
 
    } 
 
    hello() {} 
 
} 
 
const des = Object.getOwnPropertyDescriptor(A.prototype, 'hello') 
 
Object.defineProperty(A.prototype, 'hello1', { 
 
    configurable: true, 
 
    get: function() { 
 
    Object.defineProperty(this, 'hello1', { 
 
     configurable: true, 
 
     value:() => this.h, 
 
    });     
 
    return() => this.h; 
 
    } 
 
}); 
 
Object.defineProperty(A.prototype, 'hello2', { 
 
    configurable: true, 
 
    get: function() { 
 
    return() => this.h; 
 
    } 
 
}); 
 
const n = new A() 
 
console.log(n.hello1); //() => this.h  OK 
 
console.log(n.hello2); //() => this.h  OK 
 
Object.setPrototypeOf(n, null); 
 
console.log(n.hello1); //() => this.h  Still OK 
 
console.log(n.hello2); // undefined   Oops!

Es ist auch möglich, dass ein Getter Aufruf teuer mehr sein kann, eine Dateneigenschaft als das Lesen.

+0

Also sagen Sie, wenn ich 'Object.defineProperty (this, key)' 'mache, bedeutet dies, dass der Schlüssel unabhängig vom' Prototyp' an 'this' gebunden ist. –

+0

BTW, wenn Sie gemeint haben * "Es ist auch möglich, dass das Aufrufen eines GETTERS teurer sein kann als das Lesen einer Dateneigenschaft. *, Es ist nicht möglich,' this' (den Kontext der Klasse) aus dem 'Getter' zu entfernen der 'setter' ryt? –

+0

@PraneshRavi Nun, Sie können darauf im Konstruktor zugreifen – Oriol

Verwandte Themen