Teraz, gdy mamy rodzimych implementacje ES6, istnieją "prawdziwe klas". Są to w dużej mierze cukier syntaktyczny do prototypowego dziedziczenia, tak jak w przypadku funkcji konstruktora, ale istnieją subtelne różnice i nie są one całkowicie zamienne.
Do tej pory jedynym sposobem znalazłem jest uzyskanie .toString()
funkcji konstruktora prototyp obiektu i sprawdzić, czy zaczyna się class
lub jeśli obiekt ma konstruktora i .toString()
z że rozpoczyna się class
.
Zauważ, że jeśli kod jest kompilowany (tj najbardziej Babel lub maszynopis konfiguracje), to powróci function...
zamiast class...
przy starcie (od klasy są transpiled do funkcji konstruktora).
function isClass(obj) {
const isCtorClass = obj.constructor
&& obj.constructor.toString().substring(0, 5) === 'class'
if(obj.prototype === undefined) {
return isCtorClass
}
const isPrototypeCtorClass = obj.prototype.constructor
&& obj.prototype.constructor.toString
&& obj.prototype.constructor.toString().substring(0, 5) === 'class'
return isCtorClass || isPrototypeCtorClass
}
Będzie to działać tylko w rodzimych środowiskach (Chrome, Firefox, EDGE, node.js, etc.), które wdrożyły class
do kodu, który nie został transpiled do function
.
Zastosowanie:
class A {}
class B extends A {}
isClass(A) // true
isClass(new A()) // true
isClass(B) // true
isClass(new B()) // true
function C() {}
isClass(C) // false
isClass(new C()) // false
isClass({}) // false
isClass(Date) // false
isClass(new Date()) // false
//These cases return 'true' but I'm not sure it's desired
isClass(Object.create(A)) // true
const x = {}
Object.setPrototypeOf(x, A)
isClass(x) // true
Jeśli istnieje lepszy sposób, chciałbym wiedzieć, co to jest.
Czy używasz biblioteki, która implementuje dziedziczenie klasyczne w JavaScript? – Nosredna
Nie, używam zwykłego starego javascript: d – kgrad