2017-12-19 268 views
6

Próbuję się nauczyć JavaScript ES6, który jest bardzo fajnym językiem i pomyślałem, że powinienem trochę ćwiczyć, ale nie jestem w stanie wykonać an exercise. W jaki sposób można użyć literału obiektowego do skopiowania klasy.Jak używać literału obiektowego do tworzenia instancji klasy bez korzystania z konstruktora w JavaScript ES6?

Na przykład klasa jest:

class Point { 
    constructor(x, y) { 
    this.x = x, this.y = y 
    } 
    add(other) { 
    return new Point(this.x + other.x, this.y + other.y) 
    } 
} 

I chcę coś zrobić tutaj używając literał obiektu, aby wyjście prawda.

var fakePoint = YOUR_CODE_HERE 
console.log(fakePoint instanceof Point) 

Odpowiedz

5

Ja myślę, że to ćwiczenie szuka rozwiązania, które wykorzystuje __proto__ as an object literal key - jako mentioned in the slides:

var fakePoint = { 
    __proto__: Point.prototype, 
    x: Math.random(), 
    y: Math.random() 
}; 
console.log(fakePoint instanceof Point) 

Jednak __proto__ is deprecated (zarówno w literały obiektów, jak i Object.prototype getter/setter) i dostępne tylko w przeglądarkach internetowych jako standardowa funkcja ES6, dlatego zalecam unikanie takiego kodu. Właściwym rozwiązaniem jest użycie Object.create:

var fakePoint = Object.assign(Object.create(Point.prototype), { 
    x: Math.random(), 
    y: Math.random() 
}); 
console.log(fakePoint instanceof Point) 
+0

Nadal jest fałszywy jak próbowałem w węźle – vibhor1997a

+0

Czy uznają to q dupe z tego? https://stackoverflow.com/questions/15472005/setting-prototype-for-object-literal – Li357

+0

@ Li357 Nie sądzę, żadna z odpowiedzi nie używa "__proto__" wewnątrz literału obiektu. Również to pytanie dotyczy szczególnie ES6. – Bergi

0

Tak dla zabawy, tu jest inne podejście, które prawdopodobnie nie jest to, co autor ćwiczenia przeznaczone ale który niewątpliwie jest obiektem dosłowny:

var fakePoint = { 
    x: Math.random(), 
    y: Math.random(), 
    fakeConstructor: Object.defineProperty(Point, Symbol.hasInstance, { 
    value(o) { return o.fakeConstructor == this; } 
    }) 
}; 
console.log(fakePoint instanceof Point) 

Działa poprzez nadanie Point a custom hasInstance implementation który nie sprawdza łańcucha prototypów, lecz właściwość fakeConstructor. Można również użyć "x" in o && "y" in o lub czegoś podobnego. Oczywiście, że to straszne, aby zrobić ten efekt uboczny jako część obiektu dosłownym, to lepiej być napisane

Object.defineProperty(Point, Symbol.hasInstance, { 
    value(o) { return o.fakeConstructor == this; /* this === Point */ } 
}); 
var fakePoint = { 
    x: Math.random(), 
    y: Math.random(), 
    fakeConstructor: Point 
};