2008-12-10 30 views
18

Làm cách nào để mô phỏng các lớp (và không gian tên) trong JavaScript?Làm cách nào để mô phỏng "các lớp" trong JavaScript? (có hoặc không có thư viện của bên thứ ba)

Tôi cần tạo thư viện JavaScript và có ít kinh nghiệm về ngôn ngữ. Tôi luôn nghĩ rằng nó có hỗ trợ riêng cho các lớp, nhưng nó ít liên quan đến Java hơn tôi đã giả định. Dường như mọi thứ trong JavaScript thực sự là một chức năng. Những gì tôi đã phát hiện ra cho đến nay rất có ý nghĩa với nó là một ngôn ngữ gõ động yếu, nhưng điều này làm cho nó một chút khởi hành cho những người đang sử dụng để có một ngôn ngữ gõ mạnh mẽ và sử dụng một trình biên dịch để phát hiện lỗi của chúng tôi :)

Tôi chủ yếu làm việc trong C# và Java, và hy vọng một cái gì đó tương tự như vậy thư viện sẽ trông quen thuộc với các nhà phát triển C# khác của chúng tôi.

Tôi có loại mã sau đây hoạt động, nhưng tôi đã tự hỏi những gì nhà phát triển khác sẽ làm được về điều này. Các lựa chọn thay thế là gì? Có cách nào tốt hơn không? Có cách nào dễ đọc hơn không?

Tôi hiểu rằng những gì tôi muốn là một cái gì đó tương tự như C# hoặc Java khi tôi chỉ chấp nhận thực tế rằng là JavaScript, nhưng mục đích của tôi là cố gắng giảm bớt đường cong học tập cho các nhà phát triển khác bằng cách làm cho nó quen thuộc hơn và trực quan cho họ.

//Perform the namespace setup (this will actually be done with checking 
//in real life so we don't overwrite definitions, but this is kept short 
//for the code sample). 
var DoctaJonez = new function(); 
DoctaJonez.Namespace1 = new function(); 

/** 
* Class description. 
*/ 
DoctaJonez.Namespace1.SomeClass = function() 
{ 
    /** 
    * Public functions listed at the top to act like a "header". 
    */ 
    this.publicFunction = privateFunction; 

    /** 
    * Private variables next. 
    */ 
    var privateVariable; 

    /** 
    * Finally private functions. 
    */ 
    function privateFunction() 
    { 

    } 
} 

//Create an instance of the class 
var myClass = new DoctaJonez.SomeClass(); 

//Do some stuff with the instance 
myClass.publicFunction(); 

Trả lời

1

Ví dụ, trong http://mckoss.com/jscript/object.htm.

Bạn sẽ tìm thấy một loạt các ví dụ khi googling cho "JavaScript hướng đối tượng". Bằng cách xem xét các khung JavaScript phổ biến như Ext JS, bạn sẽ có cảm giác về các khái niệm này và cách chúng được áp dụng trong thực tế.

1

mepcotterell cung cấp liên kết tốt, nhưng tôi muốn thêm rằng cá nhân tôi thích xem không gian tên như các đối tượng tức là DoctaJonez.Namespace1 = {};.

+0

Tôi không biết bạn có thể làm điều đó, điều đó trông đẹp hơn rất nhiều. Cảm ơn bạn đã nhập :) +1 –

9

Đối với hiểu biết chung về OOP trong JavaScript bạn không thể làm tốt hơn so với đọc Douglas Crockford:

Đối với fan Dojo (và cho các kỹ thuật chung) Neil Roberts có bài viết hay:

Plain vanilla dojo.declare() có lẽ là nền tảng OOP tiên tiến nhất trong các thư viện chính xung quanh. Tôi thiên vị, nhưng đừng dùng lời của tôi vì điều đó.Dưới đây là các ví dụ về cách sử dụng nó.

Một đối tượng vani đồng bằng:

// Let's define a super simple class (doesn't inherit anything). 
dojo.declare("Person", null, { 
    // Class-level property 
    answer: 42, 

    // Class-level object property 
    name: {first: "Ford", last: "Prefect"}, 

    // The constructor, duh! 
    constructor: function(age){ 
    this.age = age; // instance-level property 
    }, 

    // A method 
    saySomething: function(verb){ 
    console.log("I " + verb + " " + 
     this.name.first + " " + this.name.last + "!" + 
     " -- " + this.answer); 
    }, 

    // Another method 
    passportControl: function(){ 
    console.log("I am " + this.age); 
    } 
}); 

Ví dụ về sử dụng:

// A fan of Ford Perfect 
var fan = new Person(18); 
fan.saySomething("love"); // I love Ford Perfect! -- 42 
fan.passportControl(); // I am 18 

Độc thừa kế là dễ dàng:

// Let's create a derived class inheriting Person 
dojo.declare("SuperAgent", Person, { 
    // Redefine class-level property 
    answer: "shaken, not stirred", 

    // Redefine class-level object property 
    name: {first: "James", last: "Bond"}, 

    // The constructor 
    constructor: function(age, drink){ 
    // We don't need to call the super class because 
    // it would be done automatically for us passing 
    // all arguments to it. 

    // At this point "age" is already assigned. 

    this.drink = drink; // Instance-level property 
    }, 

    // Let's redefine the method 
    saySomething: function(verb){ 
    // Let's call the super class first 
    this.inherited(arguments); 
    // Pay attention: no need for extra parameters, or any extra code, 
    // we don't even name the class we call --- it is all automatic. 
    // We can call it any time in the body of redefined method 

    console.log("Yeah, baby!"); 
    }, 

    shoot: function(){ console.log("BAM!!!"); } 
}); 

Ví dụ về sử dụng:

// Let's create a James Bond-wannabe 
var jb007 = new SuperAgent(45, "Martini"); 
jb007.saySomething("dig"); // I dig James Bond! -- shaken, not stirred 
          // Yeah, baby! 
jb007.passportControl(); // I am 45 
jb007.shoot();    // BAM!!! 

// Constructors were called in this order: Person, SuperAgent 
// saySomething() came from SuperAgent, which called Person 
// passportControl() came from Person 
// shoot() came from SuperAgent. 

mixins:

// Let's define one more super simple class 
dojo.define("SharpShooter", null, { 
    // For simplicity no constructor 

    // One method to clash with SuperAgent 
    shoot: function(){ 
    console.log("It's jammed! Shoot!"); 
    } 
}); 

Mixin dựa trên đa kế thừa:

// Multiple inheritance 
dojo.declare("FakeAgent", ["SuperAgent", "SharpShooter"], { 
    // Let's do it with no constructor 

    // Redefine the method 
    saySomething: function(verb){ 
    // We don't call super here --- a complete redefinition 

    console.log("What is " + verb "? I want my " + this.drink + "!"); 
    }, 
}); 

Ví dụ về sử dụng:

// A fake agent coming up 
var ap = new FakeAgent(40, "Kool-Aid"); 
ap.saySomething("hate"); // What is hate? I want my Kool-Aid! 
ap.passportControl(); // I am 40 
ap.shoot();    // It's jammed! Shoot! 

// Constructors were called in this order: Person, SuperAgent 
// saySomething() came from FakeAgent 
// passportControl() came from Person 
// shoot() came from SharpShooter. 

Như bạn thấy, dojo.declare() mang đến cho tất cả các nhu yếu phẩm với một đơn giản để sử dụng API: kế thừa đơn thẳng, đa thừa kế dựa trên mixin, chuỗi tự động của các hàm tạo và các phương thức siêu phức tạp.

1

Nếu bạn (và nhóm của bạn) được sử dụng để Java nhưng cần phải thực hiện một số JavaScript cho một trang web, có lẽ bạn nên xem xét Google Web Toolkit (GWT). Nó cho phép bạn mã JavaScript bằng cách sử dụng Java, được chuyển đổi thành JavaScript. Tôi đã không thử nó, mặc dù.

JavaScript thực sự là một ngôn ngữ khá thú vị. Nó có một vài sai sót (bao gồm cho phép bạn làm những thứ rất ngu ngốc), nhưng với một chút dicipline tự bạn có thể làm cho công cụ tuyệt vời. JavaScript thực tế là đối tượng định hướng, không quá nhiều lớp định hướng, nhưng bạn có thể thực hiện nhiều việc giống nhau. Bạn không có (AFAIK) thừa kế, nhưng nó không nghiêm ngặt chút nào (một trong những tính năng mạnh mẽ nhưng cũng nguy hiểm của nó) bằng cách gõ để bạn sẽ thấy nó không giới hạn.

+0

Điều này nghe rất thú vị. Tôi sẽ điều tra thêm về điều này, cảm ơn bạn đã liên kết :) –

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