/ / ECMAScript - come rendere un oggetto 'null' vuoto un'istanza di qualcosa - javascript

ECMAScript - come rendere un oggetto 'null' vuoto un'istanza di qualcosa - javascript

Creo un oggetto vuoto in ECMAScript senza un prototipo e definisco alcune proprietà come questa:

var obj = Object.create(null)
obj.name = "John"
obj.age = 27

Qui, obj non è un'istanza di Object.

obj.name // John
obj.age // 27
obj instanceof Object // false
obj.prototype // undefined
obj.constructor // undefined

Cercando di rendere obj un'istanza di qualcosa usando due metodi per estendere questo oggetto vuoto.

utilizzando Object.__proto__ non funziona.

function EmptyObject() {
this.__proto__ = Object.create(null)
this.foo = function() { // could use defineProperty
return this.bar // obviously does not exist here
}
return this
}

var obj = new EmptyObject()
obj instanceof EmptyObject // false!

Estensione di EmptyObject utilizzando ES6 la classe si estende non funziona neanche.

class SpecialObject extends EmptyObject { ... }
let obj = new SpecialObject()
obj instanceof SpecialObject // also false

Ho provato a simulare l'istanza dando obj un prototipo e la proprietà del nome del costruttore come un normale oggetto ma questo non cambia il valore di ritorno di instanceof.

È in qualche modo possibile realizzare questo tipo diOggetto un'istanza di qualcosa? Forse avvolgendolo in una funzione in modo diverso o usando l'estensione della classe ES6? Non mi dispiace scorrere le chiavi degli oggetti o cancellarle manualmente nella funzione se si ritiene che sia il metodo di implementazione migliore.

Lo scopo è quello di creare un oggetto che sia non istanza of Object (nessun prototipo, ecc.) ma può essere un'istanza di qualcosa. Ciò è effettivamente possibile? Forse in modo subdolo e confuso.

var obj = new EmptyObject()
obj instanceof Object // false
obj instanceof EmptyObject // true

Grazie!

risposte:

2 per risposta № 1

Assegnazione this.__proto__ = Object.create(null) all'interno del costruttore ti impedirà completamente di estendere questa classe. Non farlo. Ho il sospetto che quello che stai effettivamente cercando sia

function EmptyObject() {…}
EmptyObject.prototype = Object.create(null);

o in ES6

class EmptyObject extends null {
…
}

che puoi istanziare, su cui instanceof funzionerà e che è possibile estendere utilizzando class sintassi. utilizzando new EmptyObject creerà un oggetto che eredita dal file EmptyObject.prototype oggetto, che a sua volta eredita dal nulla (ad es. null) invece di Object.prototype come di solito.