2012-04-11 27 views
5

Tôi có JavaScript này:Làm cách nào để bọc một hàm tạo?

var Type = function(name) { 
    this.name = name; 
}; 

var t = new Type(); 

Bây giờ tôi muốn để thêm video này:

var wrap = function(cls) { 
    // ... wrap constructor of Type ... 
    this.extraField = 1; 
}; 

Vì vậy, tôi có thể làm:

wrap(Type); 
var t = new Type(); 

assertEquals(1, t.extraField); 

[EDIT] Tôi muốn một instance property, không phải thuộc tính class (static/shared).

Mã được thực thi trong hàm trình bao sẽ hoạt động như thể tôi đã dán nó vào hàm tạo thực.

Loại Type không được thay đổi.

+1

Bằng những gì tôi hiểu, bạn muốn thêm thuộc tính bổ sung vào hàm tạo? để các cá thể mới có thêm thuộc tính đó? – Joseph

+0

Có thể bạn chỉ cần thay đổi nguyên mẫu 'Type' bên trong hàm' wrap() '. Ví dụ: 'var wrap = function (cls) {cls.prototype.extraField = 1; }; '? Hoặc có thể là tốt nhất để tạo mới 'Type2' kế thừa từ' Type' với thành viên 'extraField' bổ sung? –

+0

Bạn có thể mô tả chi tiết hơn về vấn đề của mình không? – seteh

Trả lời

5

cập nhật: An updated version here

những gì bạn đang thực sự tìm kiếm đang mở rộng Loại thành một lớp khác. Có rất nhiều cách để làm điều đó trong JavaScript. Tôi không thực sự là một fan hâm mộ của các newprototype phương pháp xây dựng "lớp học" (Tôi thích ký sinh kế thừa phong cách tốt hơn), nhưng đây là những gì tôi nhận:

//your original class 
var Type = function(name) { 
    this.name = name; 
}; 

//our extend function 
var extend = function(cls) { 

    //which returns a constructor 
    function foo() { 

     //that calls the parent constructor with itself as scope 
     cls.apply(this, arguments) 

     //the additional field 
     this.extraField = 1; 
    } 

    //make the prototype an instance of the old class 
    foo.prototype = Object.create(cls.prototype); 

    return foo; 
}; 

//so lets extend Type into newType 
var newType = extend(Type); 

//create an instance of newType and old Type 
var t = new Type('bar'); 
var n = new newType('foo'); 


console.log(t); 
console.log(t instanceof Type); 
console.log(n); 
console.log(n instanceof newType); 
console.log(n instanceof Type); 
+0

Từ đầu ra bàn điều khiển của bạn, tôi muốn mở rộng hàm được lưu trữ trong 'hàm tạo'. Trường mới sẽ hiển thị bên cạnh 'name', không phải bên cạnh' constructor'. –

+0

vì vậy những gì bạn thực sự muốn làm là tạo một hàm tạo khác? hoặc chỉ cần thêm vào hiện tại? – Joseph

+0

Tôi muốn mở rộng hàm tạo hiện có. –

0

Tôi không biết làm thế nào để làm theo cách bạn gợi ý, mặc dù tôi thừa nhận rằng tôi sẽ quan tâm đến tôi. Tôi chỉ có thể nghĩ đến việc gán lại biến Loại cho hàm bao bọc như sau:

var wrap = function(name) 
{ 
    Type.prototype.constructor.call(this, name); 
    this.extraField = 1; 
}; 
wrap.prototype = Type.prototype; 
Type = wrap; 

var t = new Type(); 
assertEquals(1, t.extraField); 
Các vấn đề liên quan