2014-07-11 60 views
5

Tất cả các lớp nguyên cảo của chúng tôi thừa hưởng (trực tiếp hoặc gián tiếp) từ:nguyên cảo MyObject.instanceOf()

export class WrObject { 
    className:string; 

    public instanceOf(name : String) : boolean { 
     return this.className === name; 
    } 
} 

Chúng tôi sau đó khai báo một lớp con như:

export class Section extends WrObject { 
    public static CLASS_NAME = 'Section'; 
    className = Section.CLASS_NAME; 

     public instanceOf(name : String) : boolean { 
      if (this.className === name) 
       return true; 
      return super.instanceOf(name); 
     } 

} 

Và sau đó bạn có thể kiểm tra với:

if (obj.instanceOf(Section.CLASS_NAME)) 

Tất cả đều hoạt động tốt. Tuy nhiên, tôi nghĩ nó sẽ sạch hơn nếu chúng ta có thể làm:

if (obj.instanceOf(Section)) 

Có cách nào để làm điều đó không? Hoặc bất kỳ đề xuất như một cách tiếp cận tốt hơn?

cảm ơn - dave

Trả lời

13

Nếu bạn sẵn sàng chấp nhận bản chất nguyên chủng của JavaScript bạn có thể ju st sử dụng instanceof để kiểm tra chuỗi nguyên mẫu:

class Foo{} 
class Bar extends Foo{} 
class Bas{} 

var bar = new Bar(); 

console.log(bar instanceof Bar); // true 
console.log(bar instanceof Foo); // true 
console.log(bar instanceof Object); // true 

console.log(bar instanceof Bas); // false 
+0

tôi nghĩ (không thể tìm thấy bài ở đây bây giờ) rằng việc sử dụng instanceof được nản chí trong nguyên cảo như là không chính xác. Tôi đã hiểu lầm các chủ đề khác? –

+1

phụ thuộc. Bạn không có kế hoạch sử dụng 'instanceof' trên một' null' là bạn? ;) + không đáng tin cậy giữa các iframe (nó không giống 'Foo.prototype' trong mỗi khung nếu bạn kiểm tra bằng tham chiếu đó là những gì điều này đang làm bên dưới). Có lẽ vấn đề tương tự trong webworkers nhưng tôi không chắc chắn – basarat

+0

Với nulls - no. Trong công nhân web - có ở mọi nơi. Và với các đối tượng được tạo trong một luồng, được đăng lên một luồng khác và trong chuỗi nhận, chúng tôi gán proto để chuyển dữ liệu đã nhận trở lại thành một đối tượng. –

0

Tôi đoán đây có thể làm việc Example on Playground

var getName = function(obj) : string { 
    var funcNameRegex = /function (.{1,})\(/; 
    var results = (funcNameRegex).exec(obj); 
    return (results && results.length > 1) ? results[1] : ""; 
}; 

class Foo 
{ 

} 

function IsTypeOf(obj: any, type: Function) 
{ 
    alert(obj.constructor.name + " == " + getName(type)); 
} 

IsTypeOf(new Foo(), Foo); 

liên quan

2

Bạn có thể làm điều đó. Chỉ cần thay thế thực hiện của bạn instanceOf với một này:

public instanceOf(cls: { CLASS_NAME: string; }) { 
    return cls.CLASS_NAME === this.className || super.instanceOf(cls); 
} 
+2

Hãy coi chừng thực tế là các lớp trong các không gian tên khác nhau có cùng tên có thể là một vấn đề. Programming.Parent và Genealogy.Parent là các lớp rất khác nhau trong các cây và các không gian tên thừa kế khác nhau, nhưng sẽ kiểm tra sai sự thật ở đây vì các tên chuỗi của chúng phù hợp. –

Các vấn đề liên quan