2011-12-16 32 views
9

Tôi muốn khỉ vá bản dựng của đối tượng 'Bộ điều khiển' này. Nhưng làm thế nào để khỉ vá chức năng của hàm tạo nên tôi vẫn có thể gọi hàm gốc? Đây là những gì tôi đã thử.Làm thế nào để khỉ vá một hàm xây dựng của đối tượng?

// original 
function Controller() { 
    this._tag = 'div'; 
} 
Controller.prototype.tag = function() { 
    console.log(this._tag); 
} 

var c = new Controller(); 
c.tag(); // -> 'div', as expected 


// patch attempt 
var original = Controller; 
Controller = function() { 
    original.apply(this); 
    this._tag = 'patched'; // patch 
} 

var c = new Controller(); 
c.tag(); // no method tag, prototype appears wiped... 
+0

Toán tử nhóm xung quanh biểu thức hàm RHS là thừa. "Constructor" được khai báo bên trong một hàm khác, do đó bạn không thể truy cập nó từ bên ngoài (trừ khi mã bị thiếu làm cho nó trở thành thuộc tính của hàm ẩn danh bên ngoài hoặc một số đối tượng khác). Vì vậy, nếu bạn muốn "khỉ vá" các nhà xây dựng (bất cứ điều gì có nghĩa là), chèn mã nơi bạn có bình luận là cách duy nhất. – RobG

+0

@RobG Nếu tò mò: http://en.wikipedia.org/wiki/Monkey_patch Nó khá thẳng về phía trước để khỉ vá một tài sản hoặc phương pháp, nhưng vì các hàm xây dựng chức năng tình trạng đặc biệt tôi đang thua lỗ. Bạn có thể chính xác rằng điều này là không thể, nhưng tôi không chắc chắn về lý do bạn nêu ra. Tôi sẽ cập nhật mẫu mã để phản ánh. –

+0

đã thêm một mẫu mã tốt hơn. –

Trả lời

8

Bạn dường như muốn làm một cái gì đó như:

Constructor.prototype.oldTag = Constructor.prototype.tag; 

Constructor.prototype.tag = function() {/* whatever */}; 

Bây giờ tất cả các trường được mới phương pháp thẻ và bạn vẫn có thể gọi oldTag nếu bạn muốn (hoặc đặt lại).

Hoặc có lẽ bạn muốn làm một cái gì đó như:

var oldConstructor = Constructor; 

var Constructor = function() { /* new constructor */ }; 
Constructor.prototype = oldConstructor.prototype; 

Vì vậy, bây giờ bạn có một constructor mới với tất cả các phương pháp cũ. Hoặc làm cả hai bên trên. Chỉ cần sử dụng tiếng Anh đơn giản để nói những gì bạn muốn làm.

+0

Cảm ơn. Cho đến nay, có vẻ như những gì tôi đang cố gắng làm là không thể. –

2

Cách sạch không phải là khỉ vá các nhà xây dựng: đặt logic constructor trong một init phương pháp và khỉ vá riêng biệt/kế thừa đó để thay thế.

function Constructor(){ 
    this.init(); 
} 
Constructor.prototype.init = function(){ /*...*/ }; 

Bạn cũng có thể xem xét xây dựng đối tượng với một hàm xây dựng

function make_fancy_obj(){ 
    var obj = new Constructor(); 
    obj.foo = 'bar'; 
    return obj; 
} 
+0

Tôi đã sửa lỗi ertor chính tả, hàm funciton trở thành hàm. Đừng bận tâm tôi. – MrBoJangles

+1

@MrBoJangles: Khi tôi cuối cùng thống trị vũ trụ, tôi sẽ thay đổi định luật vật lý để thay thế tất cả hàm funcitons theo hàm. Sau đó, tất cả các vấn đề của tôi sẽ được giải quyết – hugomg

+2

Tôi không có quyền truy cập vào các nhà xây dựng ban đầu không may. Đó là lý do tôi đi xuống con đường này. Bạn có thể làm điều này mà không sửa đổi bản gốc trong ví dụ của tôi không? –

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