2009-03-02 46 views
18

Vì vậy, ... rối tung xung quanh trong JavaScript với một ý tưởng đó là mới với tôi, có phương pháp của một đối tượng trả lại đối tượng mà họ là phương pháp; điều này sau đó dẫn đến chainability. Câu hỏi của tôi, sau đó: làm thế nào điều này có thể hữu ích? Tôi đã ném này lại với nhau để kiểm tra các hoạt động cơ bản:Phương pháp đối tượng JavaScript Chaining: hữu ích?

<script> 
MathChain = function() 
{ 
    this.pass = function() 
    { 
     this.multiply = eval(arguments.join('*')); 
     this.add = eval(arguments.join('+')); 
     return this; 
    } 
} 

m = new MathChain().pass(5, 10, 20).multiply; // 1000 
a = new MathChain().pass(5, 10, 20).add;  // 35 
</script> 

Đó là rõ ràng không phải một trường hợp ác hiệu quả, trong đó người ta sẽ sử dụng khái niệm này, vì vậy bạn có thể chỉ cho tôi một cái gì đó mà làm như vậy đúng (ngoài jQuery, xin vui lòng)?

Trả lời

23

Vâng, đây là một ví dụ không áp dụng thực tế, nhưng tôi nghĩ bạn sẽ có ý tưởng. Nếu cho phép bạn thực hiện một số thao tác khác nhau trên một đối tượng và cung cấp sự tiện lợi.

var truck = function() { 

    this.turnLeft = function { 

     // turn left 
     return this; 

    } 

    this.turnRight = function { 

     // turn right 
     return this; 

    } 

    this.goReallyFast = function { 

     // go fast! 
     return this; 

    } 

}; 

// My get-away plan 
var myTruck = new truck(); 
myTruck.turnLeft().turnRight().goReallyFast(); 
+0

Heh, tôi thích nó; nó chắc chắn chứng minh một trường hợp sử dụng tiềm năng rất tốt. Um ... không sử dụng thế giới thực ngoài việc nó được triển khai trong các thư viện khác nhau như thế nào? –

+0

Hmmm, tôi nghĩ rằng tôi hiểu những gì bạn đang nhận được. Bạn đang nhận được câu hỏi hiệu quả? Tôi đã luôn luôn nhìn thấy nó như là một vấn đề thuận tiện. Tôi biết một số người nghĩ rằng chuỗi là ít có thể đọc được hơn có mỗi phương pháp trên dòng riêng của mình. – jonstjohn

+0

@jonstjohn, tôi muốn biết ưu và khuyết điểm của chuỗi? –

8

Ví dụ rất khác (không phải OO), chuỗi có phần tương tự với Unix pipelines. Mỗi bước của một ống Unix trả về (sửa đổi) nội dung đầy đủ, phù hợp cho việc gửi sang bước tiếp theo:

cat file1 file2 | sort -n | awk '{print $2}' | sed 's/@/ at /g' 
6

Một ví dụ mà nó rất hữu ích là với sự thay đổi nhỏ về vấn đề của bạn — thay vì trả lại cùng một đối tượng , bạn thiết kế đối tượng là không thay đổi. Sau đó, tất cả các chức năng của bạn sẽ trả lại một ví dụ mới cùng loại, nhưng với các thuộc tính đã được đặt một cách thích hợp.

Điều này có nhiều ứng dụng thực tế, đặc biệt là trong lĩnh vực lập trình hàm.

+0

Hm ... có thể trả lại this.clone(), sau đó? –

+0

um ... sắp xếp, nhưng tôi không chắc bạn hiểu khái niệm đó chưa. Không sao đâu: những vật không thay đổi không dễ. Nhìn vào lớp String của Net. Ví dụ tốt để bắt đầu. –

+0

Đây là một điểm rất thú vị mà ban đầu được ẩn cho người mới bắt đầu trong lập trình. trả về một câu đối tượng một đối tượng mới đôi khi không rõ ràng. Vấn đề chính là nếu bạn không tạo đối tượng mới, đôi khi điều này dẫn đến xử lý trỏ đến cùng một đối tượng và các từ mới sẽ bị nhầm lẫn khi cả hai biến "" thay đổi khi chúng chỉ sửa đổi một biến. – trusktr

1

Trong JavaScript, điều này luôn luôn xuất hiện khi điều hướng DOM. Đặc biệt khi cố gắng lội theo cách của bạn thông qua một loạt các yếu tố không có id.

Ví dụ: có câu hỏi về SO liên quan đến finding the first element of a table. Nó có thể liên quan đến rất nhiều vòng lặp hoặc chuỗi lệnh.

3

Mặc dù nó không hoạt động giống như ví dụ của bạn (TBH Tôi chưa bao giờ thấy nó được thực hiện theo cách đó trước đây), jquery considers "chaining" to be very useful, và jquery là khá nhiều thước đo trong những ngày này khi nói đến khuôn khổ web JS. .. do đó, yeah :-)

-2

Tất cả trẻ em đều yêu thích chuỗi. Tuy nhiên, theo kinh nghiệm của tôi, nó nên được sử dụng cẩn thận vì nó có thể làm giảm khả năng đọc mã. Nói cách khác, hãy làm những gì có ý nghĩa với bạn và có thể dễ dàng được hiểu bởi các lập trình viên khác, những người có một sự hiểu biết cơ bản về khái niệm này ..

+7

Tôi perosonally không nghĩ rằng nó messes lên dễ đọc nếu tên phương pháp được đặt tên theo một cách tốt đẹp. 'car.turnLeft(). turnRight(). goStraight(). stop();' có vẻ khó đọc với tôi. – trusktr

+0

Chaining là một cách để cải thiện khả năng đọc. Thông thường, các nhà phát triển nghĩ rằng một cái gì đó là 'không đọc được' khi nhìn thấy một cái gì đó mới bởi vì họ chỉ đơn giản là không quen thuộc với nó. – E10

0

Chuỗi JavaScript có thể rất hữu ích nếu bạn muốn tạo chuỗi hành động đơn lẻ vật. Tôi đồng ý với Michael Luton bên dưới, chuỗi phải được xử lý cẩn thận. Nếu bạn thêm một hoặc hai phương pháp xích vào một đối tượng vẫn có thể đọc được. Nếu bạn bắt đầu thêm bốn, năm, hoặc thậm chí chín, sau đó mã của bạn trở nên khó hơn không chỉ để đọc nhưng để duy trì.

3

Tôi đã tìm thấy câu hỏi này trong khi tìm kiếm giải pháp chung để tạo các phương thức có thể chuỗi, sau khi chúng được xác định. Đây là những gì tôi nghĩ ra.Tôi là một người mới sử dụng JavaScript; người mua hãy cẩn thận.

makeChainable = function() { 
    var receiver = arguments[0] 
    for (var i = 1; i < arguments.length; i++) { 
     functionName = arguments[i]; 
     (function() { 
      wrapped = receiver[functionName]; 
      receiver[functionName] = function() { 
       wrapped.apply(receiver, arguments); 
       return receiver; 
      } 
     })(); 
    } 
} 

daisy = { 
    name: 'Daisy', 
    moo: function() { console.log(this.name + " moos!") } 
} 

makeChainable(daisy, 'moo'); 
daisy.moo().moo().moo(); 
Các vấn đề liên quan