2012-11-08 19 views
5

Nói rằng tôi muốn tạo ra các API sau:Làm cho từ khoá mới không bắt buộc

var api = function(){} 

api.prototype = { 
    constructor: api, 
    method: function() { 
    return this; 
    } 
}; 

Bây giờ, điều này sẽ làm việc như:

var myApi = new api(); 
myApi.method(); 

Nhưng chúng ta hãy nói rằng tôi muốn làm cho từ khóa new tùy chọn, để điều này sẽ hoạt động:

api().method(); 

Tôi sẽ ra khỏi đầu của tôi làm:

var api = function() { 
    if (!(this instanceof api)) { 
    return new api(); 
    } 
}; 

Nhưng tôi đã tự hỏi, điều này có thể dễ dàng bị lây nhiễm bằng cách nào đó, hoặc có những mối nguy hiểm khác xung quanh bằng cách sử dụng phương pháp này? Tôi biết rằng f.ex jQuery không làm điều này (chúng dỡ bỏ hàm tạo thành một phương thức nguyên mẫu), vì vậy tôi chắc chắn có lý do chính đáng để không làm điều này. Tôi chỉ không biết họ.

+1

Giải pháp của bạn có vẻ hoàn toàn ổn, tôi đã thấy được sử dụng ở nhiều nơi. Xem [ở đây] (http://ejohn.org/blog/simple-class-instantiation/), ví dụ. – bfavaretto

Trả lời

2

trả về một đối tượng trong hàm hàm tạo.

function Car(){ 
    var obj = Object.create(Car.prototype); 
    obj.prop = 1; 
    return obj; 
} 
Car.prototype = { 
    method: function(){ } 
}; 

//test 
var car1 = Car(); 
var car2 = new Car(); 
+0

'Object.create (...)' đặc biệt tốt vì nó sử dụng ép buộc đối với việc thẩm vấn và loại bỏ bất kỳ tham chiếu nào đến 'this' trong hàm tạo, do đó bạn không cần phải biết lý do' this' là gì trong ngữ cảnh constructor . Các phương thức sẽ vẫn có quyền truy cập vào 'this' như mong đợi. – Eric

-1

Chọn một hoặc một quy ước khác. Nếu bạn muốn sử dụng các đối tượng cho các xử lý API của bạn, nhưng không muốn mọi người phải sử dụng new, hãy sử dụng hai hàm. Api() là một hàm tạo cho các đối tượng và api() đó là hàm bình thường chỉ trả về một cá thể Api mới.

Tôi không nghĩ rằng có một nguy hiểm cho những gì bạn đề xuất, nó chỉ có vẻ vô nghĩa và tôi không thích ý tưởng của một chức năng làm hai việc cùng một lúc.

+1

Tùy chọn 'mới' cho phép các nhóm sử dụng API theo cách phù hợp với quy ước của riêng họ. Một số đội mạnh chống lại 'mới' vì gotchas của nó và những người khác sử dụng nó cho cảm giác tương tự của nó với ngôn ngữ với thừa kế. Sẽ tốt hơn nếu API không buộc các nhóm phá vỡ các quy ước của họ như thế này. Lớp 'Router' của Express.js là một ví dụ hay về' new' tùy chọn. – Eric