Ich suche nach einer Möglichkeit, ein benutzerdefiniertes Object() Objekt zu erstellen. Ich möchte einen Weg finden, um zu überprüfen, wovon ein bestimmtes Objekt eine Instanz ist. Ich brauche eine Möglichkeit, das benutzerdefinierte Objekt vom nativen zu unterscheiden.

function CustomObj (data) {
  if (data) return data
  return {}
}
CustomObj.prototype = Object.prototype

var custom = new CustomObj()
var content = new CustomObj({'hello', 'world'})
var normal = new Object()

console.log(custom) // => {}
console.log(content) // => {'hello', 'world'}
console.log(custom instanceof CustomObj) // => true (expected: true)
console.log(content instanceof CustomObj) // => true (expected: true)
console.log(custom instanceof Object) // => true (expected: false)
console.log(content instanceof Object) // => true (expected: false)
console.log(normal instanceof CustomObj) // => true (expected: false)
console.log(normal instanceof Object) // => true (expected: true)

Ich gehe davon aus, dass dies daran liegt, dass ich das prototypes von Object erbe. Ich habe versucht, ein this.name hinzuzufügen, aber es hat instanceof nicht geändert.

1
ThomasReggi 21 Aug. 2015 im 22:48

3 Antworten

Beste Antwort
function Custom (literal) {
  if (literal) return literal
  return {}
}
Custom.prototype = Object.prototype
Custom.prototype.constructor = Custom

var foo = new Custom()

if (foo.constructor.name === 'Custom') {
  // foo is a custom object literal
}

// However it registers as an instance of both `Custom` and `Object`
console.log(foo instanceof Custom) // => true
console.log(foo instanceof Object) // => true
console.log({} instanceof Custom) // => true
console.log({} instanceof Object) // => true
0
ThomasReggi 22 Aug. 2015 im 13:05

Ich glaube, das entspricht Ihren Anforderungen. Beachten Sie, dass die Eigenschaften des Prototyps im Konstruktor mit dieser Lösung definiert werden müssen, da der Prototyp überschrieben wird.

function CustomObj (data) {
  CustomObj.prototype = Object.create(null)
  CustomObj.prototype.x = "Hello world!"

  return Object.create(CustomObj.prototype)
}

var custom = new CustomObj()
var normal = new Object()

console.log(custom.x); // => "Hello world!" (expected: "Hello world!")
console.log(custom instanceof CustomObj) // => true (expected: true)
console.log(custom instanceof Object) // => false (expected: false)
console.log(normal instanceof CustomObj) // => false (expected: false)
console.log(normal instanceof Object) // => true (expected: true)
0
Adam 21 Aug. 2015 im 20:14

Diese Antwort ist falsch. Ich behalte es hier, weil die Kommentare nützlich sein könnten, um die Frage zu verstehen.

Der Grund, warum alle Ihre Ausdrücke als wahr ausgewertet werden, ist, dass instanceof in der Instanzprototypkette der linken Instanz nach dem Prototyp des rechten Konstruktors (dem "Typ") sucht. Der Prototyp von Object und der Prototyp von CustomObj sind identisch, sodass der Ausdruck in all Ihren Fällen als wahr ausgewertet wird

0
Amit 21 Aug. 2015 im 21:29