Bây giờ chúng ta có việc thực hiện nguồn gốc của ES6, có những "lớp học thật". Đây là phần lớn cú pháp đường cho sự thừa kế nguyên mẫu như với hàm xây dựng, nhưng có sự khác biệt tinh tế và hai không hoàn toàn có thể hoán đổi cho nhau.
Cho đến nay, cách duy nhất tôi đã tìm thấy là để có được những .toString()
của hàm xây dựng nguyên mẫu của của đối tượng và kiểm tra nếu nó bắt đầu với class
HOẶC nếu đối tượng có một constructor và .toString()
của rằng bắt đầu với class
. Lưu ý rằng nếu mã của bạn được biên dịch (tức là: hầu hết các thiết lập Babel hoặc TypeScript), thì điều này sẽ trả về function...
thay vì class...
khi chạy (vì các lớp được chuyển thành hàm dựng).
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
}
này sẽ chỉ làm việc trong môi trường tự nhiên (Chrome, Firefox, Edge, Node.js, vv) đã thực hiện class
cho mã mà chưa được transpiled để function
.
Cách sử dụng:
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
Nếu có một cách tốt hơn, tôi rất muốn biết nó là gì.
Bạn có đang sử dụng thư viện triển khai kế thừa cổ điển trong JavaScript không? – Nosredna
Không, tôi chỉ sử dụng javascript cũ đơn giản: d – kgrad