2010-11-14 23 views
36

Tôi có thể làm điều gì đó như thế không ?:Làm thế nào để quá tải constructor của một đối tượng trong JS (Javascript)?

function User(form) { 
    this._username = form.username.value; 
    this._password = form.password.value; 
    this._surname = form.surname.value; 
    this._lastname = form.lastname.value; 
    this._birthdate = form.b_day.value+"-"+form.b_month.value+"-"+form.b_year.value; 
    this._avatar = form.avatar; 
    this._messages = new Array(); 
    this._messagesCount=0; 
} 

function User(userName,password,surname,lastName,birthdate) { 
    this._username = userName; 
    this._password = password; 
    this._surname = surname; 
    this._lastname = lastName; 
    this._birthdate = birthdate; 
    this._avatar = form.avatar; 
    this._messages = new Array(); 
    this._messagesCount=0; 
} 

Trả lời

34

Bạn không thể làm điều đó vì JavaScript không phải là ngôn ngữ được đánh máy mạnh nên sẽ không thấy sự khác biệt giữa biểu mẫu và tên người dùng. Bạn có thể tạo nhiều hàm như createUserFromForm(form)createUserFromUserInfo(userName, password,...) hoặc bạn có thể thử sử dụng hàm tạo đơn không có đối số được chỉ định và sau đó sử dụng đối số bộ sưu tập để kiểm tra đầu vào và quyết định việc cần làm.

6

Không, bạn không thể hỗ trợ JavaScript không hỗ trợ quá tải.

Những gì bạn có thể làm là truyền một đối tượng đã được điền với các giá trị vào hàm tạo của bạn và sau đó lấy các giá trị từ đối tượng, nhưng điều này trùng lặp mã. Hoặc bạn có thể tạo một hàm tạo mặc định và thêm các phương thức như initFromUser hoặc setFromForm, sau đó lấy các tham số tương ứng và thiết lập các giá trị đối tượng, new User().initFormForm(form) trông khá sạch sẽ với tôi.

20

Tôi thích Ilya Volodins câu trả lời và tôi nghĩ tôi sẽ thêm này như là một ví dụ:

function foo() { 
    var evt = window.event || arguments[1] || arguments.callee.caller.arguments[0]; 
    var target = evt.target || evt.srcElement; 

    var options = {}; 

    if (arguments[0]) options = arguments[0]; 

    var default_args = { 
     'myNumber'  : 42, 
     'myString'  : 'Hello', 
     'myBoolean'  : true 
    } 
    for (var index in default_args) { 
     if (typeof options[index] == "undefined") options[index] = default_args[index]; 
    } 

    //Do your thing 

} 

//then you call it like this 
foo(); 

//or 

foo({'myString' : 'World'}); 

//or 

foo({'myNumber' : 666, 'myString' : 'World', 'myBoolean' : false}); 

Có lẽ cách đẹp hơn để làm điều này nhưng đây chỉ là một ví dụ.

5

quá tải nhà xây dựng hay bất kỳ chức năng Javascript khác bằng cách đếm số lượng các đối số:

function FooString() 
{ if(arguments.length>0) 
    { this.str=arguments[0]; 
     return; 
    } 
    this.str=""; 
} 

var s1=new FooString; 
var s2=new FooString("hello world"); 

Bạn cũng có thể thiết lập tham số mặc định bằng cách phát hiện có bao nhiêu đối số đang thiếu.

0

Bạn có thể dễ dàng mô phỏng các phương thức quá tải và các hàm tạo bằng cách sử dụng kết hợp các chuỗi JSON và lệnh typeof. Xem ví dụ bên dưới - bạn thuộc tính val được định dạng từ loại dữ liệu đến:

function test(vals) 
    { 
     this.initialise = function (vals) { 

      if (typeof (vals) == 'undefined') 
      { 
       this.value = 10; 
      } 
      else if (Object.prototype.toString.call(vals) === '[object Array]') 
      { 
       this.value = vals[0]; 
      } 
      else if (typeof (vals) === 'object') { 
       if (vals.hasOwnProperty('x')) { 
        this.value = vals.x; 
       } 
       else if (vals.hasOwnProperty('y')) { 
        this.value = vals.y; 
       } 
      } 
      else { 
       this.value = vals; // e.g. it might be a string or number 
      } 

     } 

     this.otherMethods = function() { 
      // other methods in the class 
     } 

     this.initialise(vals); 
    } 

    var obj1 = test(); // obj1.val = 10; 
    var obj2 = test([30, 40, 50]); // obj1.val = 30; 
    var obj3 = test({ x: 60, y: 70 }); // obj1.val = 60; 
    var obj4 = test({ y: 80 }); // obj1.val = 80; 
    var obj5 = test('value'); // obj1.val = 'value'; 
    var obj6 = test(90); // obj1.val = 90; 
Các vấn đề liên quan