2009-05-08 29 views
5

Tôi muốn nhận được tên biến của lớp học.Cách lấy tên của lớp Mootools từ trong số

var Poop = new Class({ 
    getClassName: function() { 
     return arguments.callee._owner.name; 
    } 
}); 
var a = new Poop(); 
a.getClassName(); //want 'Poop' 

Tôi đang thực hiện điều đó sẽ được triển khai vào các lớp khác và tôi muốn tạo truy vấn SQL sử dụng tên lớp (số nhiều) cho bảng.

Tôi đã thử các kết hợp khác nhau của ví dụ trên để cố gắng lấy tên và không thể tìm ra (nếu nó thậm chí có thể xem xét hệ thống lớp MooTools).

Trả lời

8

Tìm thấy giải pháp. Hash has a keyOf function, sẽ cung cấp cho tôi tên biến chứa giá trị. Vì vậy, tôi đã thực hiện một Hash của cửa sổ, và sau đó yêu cầu cho khóa của constructor lớp.

var Poop = new Class({ 
    name: function() { 
     var w = $H(window); 
     return w.keyOf(this.constructor); 
    } 
}); 
var a = new Poop(); 
a.name(); // returns 'Poop' 

Điều này tất nhiên chỉ hoạt động vì tôi tạo các lớp trong không gian tên cửa sổ chung (như chung với MooTools). Nếu bạn đã tạo các lớp bên trong một không gian tên nào đó, thì bạn chỉ cần Hash để thay thế không gian tên đó.

Chỉnh sửa: I wrote up về cách sử dụng giải pháp này và cách làm cho giải pháp này hoạt động tự động trong không gian tên, cho bất kỳ MooToolers nào quan tâm.

0

Tôi không nghĩ rằng điều này có thể xảy ra trong Javascript, do bản chất định hướng nguyên mẫu của ngôn ngữ. Có một số việc bạn có thể làm để xác định xem một đối tượng có thuộc lớp hiện tại mà bạn biết không, chẳng hạn như:

if (a.constructor == Poop) { 
    alert("This will work, but I don't really want any Poop."); 
} 

Tuy nhiên, điều đó không thực sự hiệu quả để xác định lớp của đối tượng không xác định. Có những nguyên mẫu khác mà bạn có thể làm để kiểm tra lớp có liên quan đến toString(), nhưng chúng chỉ hoạt động cho các đối tượng dựng sẵn, không phải các lớp tùy chỉnh và đây là nhược điểm của việc tạo mẫu không dành riêng cho MooTools.

Nếu bạn xem 5th Edition of Javascript, The Definitive Guide, trang 174, chương 9.7, có một cuộc thảo luận thú vị ở đó. Về cơ bản đề nghị là để cư trú của bạn các lớp học tùy chỉnh với một tài sản classname, và ghi đè lên cơ sở mặc định đối tượng lớp toString() phương pháp để kiểm tra tài sản này khi bạn đang gọi nó trên một lớp tùy chỉnh.

2

Tôi chạy vào một vấn đề với mở rộng, nhưng không tìm thấy một con đường xung quanh nó:

var getClassNameFromKeys = function (obj, instance) { 
     var i = 0, keys = Object.keys(obj); 
     for (i; i < keys.length; i++) { 
     if ('Ext' !== keys[i] && typeOf(obj[keys[i]]) === 'class' && instance instanceof obj[keys[i]]) { 
       return keys[i]; 
      } 
     } 
    }, 
    Ext = new Class(), 
    WhatsMyName = new Class({ 
     Extends: Ext 
    }), 
    whatsMyNameInstance = new WhatsMyName(), 
    cName = getClassNameFromKeys(this, whatsMyNameInstance); 

console.log(cName); 

Bạn có thể tránh việc kiểm tra trên mở rộng tên nếu bạn làm theo một cái gì đó kiểu như thế này:

var O = {}, 
    whatsMyNameInstance; 

(function() { 
    var SUBCLASS_KEYS; 

    O.Ext = new Class({ 
     _className: null, 
     getClassName: function() { 
      var i = 0; 

      SUBCLASS_KEYS = SUBCLASS_KEYS || Object.keys(O.subclasses); 

      for (i; i < SUBCLASS_KEYS.length; i++) { 
      if (this instanceof O.subclasses[SUBCLASS_KEYS[i]]) { 
        return SUBCLASS_KEYS[i]; 
       } 
     } 
     }   
    }); 
})(); 

O.subclasses = {}; 

O.subclasses.WhatsMyName = new Class({ 
    Extends: O.Ext 
}); 

whatsMyNameInstance = new O.subclasses.WhatsMyName(); 

whatsMyNameInstance.getClassName(); 
Các vấn đề liên quan