2013-03-12 30 views
6

Có tùy chọn để không tạo đối tượng có điều kiện cụ thể trong hàm tạo hay không, ví dụ:không tạo đối tượng với Constructor mới

function Monster(name, hp) { 
    if (hp < 1) { 
     delete this; 
    } 
    else { 
      this.name = name; 
    } 
} 
var theMonster = new Monster("Sulley", -5); // undefined 
+2

Tại sao bạn không di chuyển tình trạng của mình ra ngoài chức năng 'Quái vật'? Bạn không thể sử dụng 'theMonster' nếu bạn không muốn nó là một đối tượng. Bạn có thể thêm 'this.isMonster = (hp> = 1);' vào hàm 'Monster' của bạn. – Amberlamps

+3

là ném một ngoại lệ một tùy chọn? –

Trả lời

5

Tôi nghĩ điều bạn phải làm là ném một ngoại lệ.

function Monster(name, hp) { 
    if (hp < 1) { 
     throw "health points cannot be less than 1"; 
    } 
    this.hp = hp; 
    this.name = name; 
} 

var m = new Monster("Not a good monster", 0); 
4

Một chức năng gọi là một nhà xây dựng (với các nhà điều hành new) sẽ luôn luôn trở về một thể trừ nó một cách rõ ràng trả về một đối tượng. Do đó bạn có thể trả về một đối tượng rỗng, và sử dụng các nhà điều hành instanceof để kiểm tra những gì trở lại:

function Monster(name, hp) { 
    if (hp < 1) { 
     return {}; 
    } 
    else { 
     this.name = name; 
    } 
} 
var theMonster = new Monster("Sulley", -5); 

console.log(theMonster instanceof Monster); // false 

Hành vi này được giải thích trong spec (13.2.2):

  8. Hãy kết quả là kết quả của việc gọi thuộc tính bên trong [[Call]] của F, cung cấp obj làm giá trị này và cung cấp danh sách đối số được chuyển vào [[Construct]] là args.

  9. Nếu loại (kết quả) là đối tượng thì kết quả trả về.

  10. Trả lại obj.

Tuy nhiên, như những người khác đã chỉ ra, cho dù bạn thực sự nên làm điều này là có vấn đề.

+0

Đây là lỗi lập trình để tạo ra Quái vật có sức khỏe tiêu cực, tại sao bạn lại thoát khỏi con đường của mình để làm cho nó im lặng và không thể khám phá cho đến sau này với các thông báo lỗi hoàn toàn không liên quan. Ném một ngoại lệ là điều duy nhất để làm. – Esailija

+0

@Esailija - Tôi không nói rằng tôi đã đồng ý với cách tiếp cận này, tôi vừa trả lời câu hỏi ("Có một tùy chọn để không tạo một đối tượng với điều kiện cụ thể trong constructor không?"). Tôi đã thêm một lưu ý để nói rằng bạn có lẽ không nên làm điều này. –

+0

Nó không phải là một lỗi nếu con quái vật là undead ... nếu bạn biết những gì tôi có nghĩa là;) – WTK

1

Nó không có ý nghĩa, bạn đang cố gắng ngừng xây dựng một đối tượng trong giai đoạn xây dựng của nó. Cách tốt hơn là sử dụng một cái gì đó được đề xuất bởi @Amberlamps hoặc sử dụng một cái gì đó giống như mô hình nhà máy để tạo ra các đối tượng.

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