2013-04-16 36 views
5

Bạn có thể đặt tên một thể hiện giống với tên hàm tạo của nó không?Bạn có thể đặt tên một thể hiện giống với tên hàm tạo của nó không?

var myFunc = new function myFunc(){}; 

?

Có vẻ như, điều này thay thế đối tượng chức năng bằng phiên bản mới ... có nghĩa đây là một Singleton tốt.

Tôi chưa từng thấy ai sử dụng cái này, vì vậy tôi đoán, có những nhược điểm mà tôi không biết ...

Bạn nghĩ gì?

+0

@PeeHaa 埽 Nếu bạn không phải là một anh chàng JS, điều đó không quan trọng nếu bạn thấy lạ đối với bạn nhiều ... Nếu có vẻ lạ đối với nhà phát triển JS , sau đó tôi sẽ quan tâm nhiều hơn –

+0

Thực ra nó có. Bởi vì tôi ở đây để học ... – PeeHaa

+0

@PeeHaa 埽 Sau đó, đây là một bài học? –

Trả lời

1

CÓ ...

Tuy nhiên, có vẻ lạ khi bạn tạo chức năng được đặt tên nhưng không bao giờ gọi tên theo.

Các mô hình phổ biến hơn (s) Tôi đã nhìn thấy là

function MyClass(){ 
    this.val = 5; 
}; 
MyClass.prototype.getValue = function() { 
    return this.val; 
} 
MyClass = new MyClass(); 

Nhưng khi người ta làm điều đó tôi tự hỏi tại sao họ không chỉ cần sử dụng một đối tượng đen

var MyClass = { 
    val: 5, 
    getValue: function() { 
     return this.val; 
    } 
} 

Và tôi sẽ thậm chí còn thích sử dụng mẫu mô-đun ở đây

var MyClass = (function(){ 
    var val = 5; 
    return { 
     getValue: function() { 
      return val; 
     } 
    };  
})(); 

Tuyên bố từ chối

Bây giờ dù mô hình singleton nên được sử dụng, đó là một câu hỏi (mà câu trả lời là NO nếu bạn quan tâm đến kiểm tra, quản lý phụ thuộc, bảo trì, dễ đọc)

+0

Việc sử dụng 'hàm mới' là gì? – PeeHaa

+0

Tôi đã không nhận thấy rằng một phần, đó là chắc chắn một chút lạ, hãy để tôi sửa chữa câu trả lời –

+0

Nếu bạn cố gắng ghi đè lên MyClass-> val sau khi "MyClass = new MyClass()" những gì sẽ xảy ra? –

0

Có vẻ như điều này thay thế đối tượng chức năng bằng cá thể mới

Không, nó không thay thế bất cứ thứ gì. Tên của một biểu thức hàm (đó là những gì bạn có) chỉ có thể truy cập bên trong chính hàm đó, không phải bên ngoài nó. Nó sẽ giống hệt như khi bạn bỏ qua tên:

var myFunc = new function(){}; 

Nói chung, nếu bạn không muốn các biểu tượng nhất định có thể truy cập, đừng biến chúng thành toàn cầu. Xác định những biểu tượng bên trong một hàm và chỉ trả lại những gì bạn muốn làm cho truy cập, ví dụ:

var myobj = (function() { 
    function Foo() {}; 
    // do whatever 
    return new Foo(); 
}()); 

Tuy nhiên, nếu bạn chỉ muốn tạo ra một đối tượng duy nhất, nó thường là dễ dàng hơn để sử dụng một đối tượng đen:

var myobj = {}; 

Không có lý do gì để sử dụng chức năng hàm tạo nếu bạn chỉ muốn tạo một cá thể đơn lẻ từ nó.Nếu bạn muốn thiết lập thừa kế, bạn có thể sử dụng Object.create[MDN]

+0

Rõ ràng điều này có thể thực hiện được, nhưng vì lý do dễ đọc, bạn không muốn khai báo các trường hợp cùng một vị trí như các nhà xây dựng này có thể là một cách tốt để đi về nó ... – user2071276

+0

Biến không bóng chức năng được đặt tên, phải không? –

+0

@Juan: Như tôi đã nói, một biểu thức hàm được đặt tên không tạo ra một biểu tượng có tên đó trong phạm vi kèm theo. Tên chỉ có sẵn bên trong hàm. Hãy thử 'var foo = function bar() {}; cảnh báo (bar); –

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