2010-02-02 45 views
20

JS có hỗ trợ hai hàm có cùng tên và các tham số khác nhau không?Trợ giúp với các tham số JS và chức năng

function f1(a, b) 
{ 
// a and b are numbers 
} 

function f1(a, b, c) 
{ 
// a is a string 
//b and c are numbers 
} 

Tôi có thể sử dụng các chức năng JS cho IE7, FF, Opera không có vấn đề gì không?

Trả lời

32

JavaScript không hỗ trợ những gì bạn sẽ gọi bằng các ngôn ngữ khác phương pháp quá tải, nhưng có nhiều cách giải quyết, như sử dụng đối tượng arguments, để kiểm tra xem có bao nhiêu đối số mà hàm đã được gọi:

function f1(a, b, c) { 
    if (arguments.length == 2) { 
    // f1 called with two arguments 
    } else if (arguments.length == 3) { 
    // f1 called with three arguments 
    } 
} 

Ngoài ra bạn có thể gõ kiểm tra lại lập luận của bạn, ví Số và String nguyên thủy là an toàn để sử dụng typeof điều hành:

function f1(a, b, c) { 
    if (typeof a == 'number' && typeof b == 'number') { 
    // a and b are numbers 
    } else if (typeof a == 'string' && typeof b == 'number' && 
      typeof c == 'number') { 
    // a is a string, b and c are numbers 
    } 
} 

Và có kỹ thuật phức tạp hơn nhiều như một trong các bài viết sau đây, mà lợi dụng của một số ngôn ngữ JavaScript tính năng như đóng cửa, ứng dụng chức năng, vv, để bắt chước phương pháp quá tải:

7

Không, bạn không thể sử dụng quá tải hàm trong JS.

Nhưng, bạn chỉ có thể khai báo phiên bản có 3 tham số và sau đó kiểm tra xem đối số thứ ba === undefined và cung cấp hành vi khác biệt trên cơ sở đó hay không.

+0

Trong trường hợp người gọi đi một cuộc tranh luận thứ 3 nhưng giá trị của nó là * undefined * kiểm tra này sẽ thất bại. Có lẽ tốt hơn nếu hàm kiểm tra ** arguments.length ** thay thế. – NVRAM

+0

Nếu người gọi sử dụng 'undefined' làm đối số thứ 3, tôi lấy nó để báo hiệu rằng họ muốn hàm được xử lý như thể chỉ có hai được truyền vào. Tôi không thực sự thấy bất kỳ mục đích hợp pháp nào khác để chuyển trong 'undefined'. –

3

Không, điều đó sẽ không hoạt động, chỉ có chức năng thứ 2 sẽ được xác định trên trang của bạn. Here là một nguồn.

1

Không, bạn không thể làm điều đó ... trừ khi bạn đồng ý với bạn để chỉ giữ lại định nghĩa cuối cùng của bạn.

0

Bạn cũng có thể sử dụng instanceof, ví dụ với tính đa hình cơ bản.

Đầu tiên tạo ra một lớp cha (bóng)

// superclass 
function Ball() { 
    this.play = function() { 
     alert("Ball throw"); 
    }; 
} 

và bây giờ đối với một số lớp con (loại bóng)

// subclass 
function Basketball() { 
    this.play = function() { 
     alert("basketball throw"); 
    }; 
} 
// subclass 
function Soccerball() { 
    this.play = function() { 
     alert("soccer ball kick/throw"); 
     console.debug("here"); 
    }; 
} 
// subclass 
function Baseball() { 
    this.play = function() { 
     alert("strike 3 you're out"); 
     console.debug("here"); 
    }; 
} 

Cung cấp cho họ chức năng Ball, hay còn gọi là thiết lập lớp cha của họ thông qua nguyên mẫu

// set subclass functionality 
Basketball.prototype = new Ball(); 
Soccerball.prototype = new Ball(); 
Baseball.prototype = new Ball(); 

Một số đa hình (tạo ra một loạt các quả bóng và chơi với tất cả, nhưng chơi dựa trên o loại n)

var bunchOfBalls = [new Baseball(), new Soccerball(), new Basketball()]; 
for (var i = 0; i < bunchOfBalls.length; i++) { 
    bunchOfBalls[i].play(); 
} 

Bây giờ viết một chức năng mà phải mất một bóng nhưng chỉ muốn làm việc cho loại hình cụ thể của quả bóng (bắt chước chức năng quá tải, nhiều hơn hoặc ít hơn)

//overloading dependent upon type 
function BasketbalOrBaseballOnlyPlay(aBall) { 
    if (aBall instanceof Basketball) { 
     //special basketball function 
    } 
    if (aBall instanceof Baseball) { 
     //special baseball function 
    } 

} 

Nếu aBall là một sân bóng rổ do đó aBall = new Basketball(); thì aBall instanceof Basketball sẽ trả về true cho Bóng rổ và sai cho bóng chày nhưng đúng với Bóng.

Vì vậy, aBall instanceof Ball sẽ trả về true vì Bóng rổ là Bóng.

See code live at http://jsfiddle.net/kLCPB/

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