2012-11-05 5 views
15

Hãy xem hai ví dụ trong đó tôi sẽ cố gắng giải thích những gì tôi muốn hiểu.Tạo một lớp JS: IIFE vs nguyên mẫu trả về

var Car = function(){ 
    // Init class 
    function Car() { }; 
    // Private func/vars 
    var private = { color:'red' }; 
    // Public func/vars 
    Car.prototype = { 
    newColor: function(color) { private.color = color }, 
    getColor: function() { return private.color } 
    }; 

    return Car.prototype; // return with prototype 
}; 

var myCar = new Car(); 

Và:

var Car = (function(){ 
    // Init class 
    function Car() { }; 
    // Private func/vars 
    var private = { color:'red' }; 
    // Public func/vars 
    Car.prototype = { 
    newColor: function(color) { private.color = color }, 
    getColor: function() { return private.color } 
    }; 

    return Car; // avoid prototype adding parentheses on next line; 
})(); 

var myCar = new Car(); 

Hãy xem !, Cả lớp được tạo ra như biểu hiện chức năng và cả hai làm việc như nhau. Sự khác biệt duy nhất giữa chúng, là: Việc đầu tiên trả lại chức năng xe với tài sản nguyên mẫu của nó. Các tác phẩm thứ hai trả về chức năng Ô tô, tránh thuộc tính nguyên mẫu và thay vào đó sử dụng IIFE.

Sự khác nhau giữa việc sử dụng return Car.prototype; và tránh IIFE và sử dụng return Car; bằng cách sử dụng IIFE (dấu ngoặc đơn ở cuối khai báo lớp).

+0

biết chính xác là bạn đang cố gắng để đạt được? – alex

+0

Tôi đang cố gắng hiểu lý thuyết về cách thức hoạt động chuyên sâu và sự khác biệt về mặt kỹ thuật là gì. –

+1

Bạn có định sử dụng toán tử 'new' với cả hai đối tượng' Car' được trả về không? – alex

Trả lời

15

Mẫu mã thứ hai là cách thích hợp để đạt được những gì bạn đang tìm kiếm. Bạn tạo một hàm thực hiện ngay lập tức, bên trong mà bạn tạo một hàm mới, thêm vào nguyên mẫu của nó, và sau đó trả về nó.

Ví dụ đầu tiên hơi lạ và không hoàn toàn tạo chức năng hàm tạo. Dòng

return Car.prototype; // return with prototype 

khiến chức năng ô tô của bạn luôn trả về đối tượng mà bạn đã gán trước đây là Car.prototype. Này ghi đè các hành vi bình thường của một hàm gọi với new


Chỉ cần một điều cần lưu ý, dòng này:

Car.prototype = { 
    newColor: function(color) { private.color = color }, 
    getColor: function() { return private.color } 
}; 

sẽ gây ra constructor tài sản của mới tạo các đối tượng để có điểm thời gian để xe của bạn chức năng. Có hai cách dễ dàng để sửa lỗi này nếu điều này quan trọng đối với bạn.

Car.prototype = { 
    newColor: function(color) { private.color = color }, 
    getColor: function() { return private.color } 
}; 
Car.prototype.constructor = Car; // <-------- add this line 

Hoặc thay đổi ở trên để

Car.prototype.newColor = function(color) { private.color = color }; 
Car.prototype.getColor = function() { return private.color }; 
+0

Khá thú vị! –