2011-09-02 29 views
8

Tôi đang ở trong một lãnh thổ mới bây giờ, tôi đã không làm việc với loại điều này trong một thời gian.Mở rộng một hàm - hợp nhất hai hàm?

cách tốt nhất để có một 'lớp' Javascript ví dụ là gì

// In the parent instance 
function xyz() 
{ 
    var x = 1; 
} 

Tôi muốn thiết lập này trong lớp, và khi người dùng mở rộng một lớp học, tôi muốn họ một cách hiệu quả được kéo dài này chức năng. Tôi biết tôi không rõ ràng, nhưng đã lâu rồi. Đây là mã của người dùng ví dụ.

// In the child instance 
function xyz() 
{ 
    var y = 2; 
} 

Ghép nên kết quả trong:

// In the merged instance 
function xyz() 
{ 
    var x = 1; 
    var y = 2; 
} 

Am Tôi hút thuốc những thứ sai hoặc đặt câu hỏi sai?

+2

Hãy tiếp tục hút thuốc cùng một thứ :) – JoeyC

Trả lời

8

Bạn không thể 'hợp nhất' các chức năng như mô tả ở đó, nhưng những gì bạn có thể làm là có một hàm được định nghĩa lại để gọi cả chính nó và hàm mới (trước hoặc sau bản gốc).

var xyz = function(){ 
    console.log('xyz'); 
}; 

var abc = function(){ 
    console.log('abc'); 
}; 

// and, elsewhere, if you want to merge: 
var orig = abc; 
abc = function(){ 
    orig.call(this, arguments); 
    xyz.call(this, arguments); 
}; 

Không bao gồm (này, đối số) nếu bạn không quan tâm đến bối cảnh thực thi hoặc nếu hàm được gọi là không tham số. Nhưng tôi đã nói cho rõ ràng về những gì người ta có thể làm nếu bạn muốn có một phương pháp tham số hóa.

8

Bạn gắn thẻ câu hỏi với jquery, vì vậy tôi giả sử bạn sử dụng jquery. với jquery, bạn có thể hợp nhất các đối tượng với jQuery.extend().

var object1 = { 
    apple: 0, 
    banana: {weight: 52, price: 100}, 
    cherry: 97 
}; 
var object2 = { 
    banana: {price: 200}, 
    durian: 100 
}; 

/* merge object2 into object1 */ 
$.extend(object1, object2); 

hoặc sử dụng chuỗi mẫu để thực hiện kế thừa. ví dụ:

function a() { 
    this.t1 = 1; 
    this.sayMyName = function() { 
     alert('a'); 
    } 
} 
b.prototype = new a; 
b.prototype.constructor = b; 
function b() { 
    this.t2 = 2; 
    this.sayMyName = function() { 
     alert('b'); 
    } 
} 
var obj = new b(); 
alert(obj.t1); // this would say 1 
obj.sayMyName(); // this would say b 
+0

Chuỗi nguyên mẫu là thứ tôi quan tâm - Tôi đã đọc nhanh về tạo mẫu, nhưng nó không đi vào chức năng. Bạn có biết bất kỳ đọc tốt cho điều này? –

+0

Có nhiều cách để triển khai lớp/kế thừa trong javascript. đây là một số bài viết về javascript hướng đối tượng. [3 cách định nghĩa một lớp JavaScript] (http://www.phpied.com/3-ways-to-define-a-javascript-class/) [Lập trình hướng đối tượng trong JavaScript] (http://mckoss.com /jscript/object.htm) [Kế thừa cổ điển trong JavaScript] (http://www.crockford.com/javascript/inheritance.html) hy vọng sự trợ giúp này :) – ntangjee

0

Nếu tôi hiểu bạn một cách chính xác, bạn có thể thử đổi tên các chức năng độc đáo và gọi đó là trong phạm vi chức năng mới:

// In the parent instance 
function xyz() 
{ 
    var x = 1; 
} 

// In the child instance 
var old_xyz = xyz; 
function xyz() 
{ 
    var y = 2; 
    old_xyz(); 
} 

Cũng làm việc với lớp/phương pháp kế thừa:

MyClass.prototype.old_xyz = MyClass.prototype.xyz; 
MyClass.prototype.xyz = function() { 
    this.old_xyz(); 
} 
Các vấn đề liên quan