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 № 1Assegnazione 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.