2016-11-19 2 views
0

J'ai un scénario où j'ai besoin de modifier un property d'unen utilisant Object.defineProperty(). Je sais que cela peut être fait à travers le get() du descriptor.Object.defineProperty() à l'intérieur du getter

Si vous voyez l'exemple ci-dessous, j'essaie de retourner un function qui, lorsqu'il sera appelé, retournera une valeur de this.

Ma question est, dois-je define encore property pour l'objet this? Est-ce nécessaire? Si oui, pourquoi?

Lorsque je définis une propriété à une classe, this reflétera également le même droit?

Je suis passé par this et je suis curieux de savoir pourquoi il le fait. J'ai

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

Votre code actuel définira une nouvelle propriété à chaque accès au prototype. –

+0

@ SoftwareEngineer171 En dehors du getter vous n'obtiendrez pas 'this' –

+0

Vous n'obtiendrez pas ceci si vous utilisez des fonctions de flèche. Au lieu de cela, vous devez utiliser des fonctions standard, vous pouvez donc les lier à votre instance (ou prototype) et accéder à l'instance 'this'. –

Répondre

1

aucune idée pourquoi cette personne est en train de faire cela. Je ne le ferais probablement pas. Mais si votre question est de savoir s'il y a une différence à le faire ou non, la réponse est oui.

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!

Il est également possible que l'appel d'un getter peut être plus cher que la lecture d'une propriété de données. Pourquoi ne pas simplement définir cette propriété en dehors de getter?

+0

Donc, vous dites quand je fais 'Object.defineProperty (this, key)', cela signifie que la clé est liée à 'this' indépendamment du' prototype'. –

+0

BTW, quand vous vouliez dire * "Il est également possible que l'appel d'un getter soit plus cher que la lecture d'une propriété data. *, Il n'est pas possible d'obtenir' this' (le contexte de la classe) sur 'getter' ou le 'setter' ryt? –

+0

@PraneshRavi Eh bien, vous pouvez y accéder dans le constructeur – Oriol