2011-01-24 42 views
29

Giả sử tôi có một lớp học như thế này:Javascript thừa kế và phương pháp trọng

function Widget() { 
    this.id = new Date().getTime(); 
    // other fields 
} 
Widget.prototype = { 
    load: function(args) { 
     // do something 
    } 
} 

Từ lớp học này tôi đã tạo một số lớp khác mà kế thừa nguyên mẫu giống nhau nhưng có một số phương pháp bổ sung. Những gì tôi muốn làm là có thể định nghĩa một phương thức load() trong các lớp con mà trước tiên gọi phương thức cha và sau đó thực hiện một số mã. Một cái gì đó như:

SpecialWidget.prototype = { 
    load: function(args) { 
     super.load(args); 
     // specific code here 
    } 
} 

Tôi biết không có từ khóa siêu trong Javascript nhưng phải có cách để thực hiện việc này.

Trả lời

40

Bạn có thể mô phỏng nó như thế này:

SpecialWidget.prototype = { 
    load: function(args) { 
     Widget.prototype.load.call(this, args); 
     // specific code here 
    } 
} 

Hoặc bạn có thể tạo bất động sản siêu của riêng bạn như thế này:

SpecialWidget.prototype.parent = Widget.prototype; 

SpecialWidget.prototype = { 
    load: function(args) { 
     this.parent.load.call(this,args); 
     // specific code here 
    } 
} 
+1

Tôi đoán đây là giải pháp đơn giản nhất! Cảm ơn bạn –

+0

Điều này mang lại cho tôi một vòng lặp vô hạn trong mã của tôi và tôi không chắc chắn tại sao .. – CarbonDry

+0

Chỉ cần thêm vào nhận xét trước của tôi, tôi có một đối tượng đã được thừa kế từ một lớp và tôi muốn chuyên về phương pháp cơ bản. – CarbonDry

1

Tôi không biết nếu điều này là giải pháp tốt nhất, nhưng bạn có thể làm một cái gì đó như thế này:

function Widget() { 
    this.id = new Date().getTime(); 
} 
Widget.prototype.load = function(args) { 
    alert('parent load'); 
}; 

SpecialWidget = function(){}; 

    // Make the prototype of SpecialWidget an instance of Widget 
var proto = SpecialWidget.prototype = new Widget; 

    // Give the prototype a function that references the "load" from Widget 
proto.parent_load = proto.load; 

    // Give SpecialWidget its own "load" that first calls the parent_load 
proto.load = function(args) { 
    this.parent_load(args); 
    alert('special load'); 
}; 

var inst = new SpecialWidget; 

inst.load(); 

Điều này làm cho nguyên mẫu SpecialWidget một thể hiện của Widget để nó kế thừa tất cả những gì Widget có.

Sau đó, nó làm cho một tham chiếu đến load() của Widget gọi parent_load(), và tạo riêng load() của nó mà các cuộc gọi parent_load() khi gọi.

+0

Bạn có thể sử dụng 'Object.create (Thing.prototype)' thay vì 'Thing'if mới nếu bạn không phục vụ cho các khách hàng cũ. – LeeGee

2

vì vậy đầu tiên, bạn thiết lập 'lớp con' của bạn như vậy

function SubClass(name) { 
    Super.call(this); 

    // stuff here 
} 

SubClass.prototype = new SuperClass(null); 
SubClass.prototype.constructor = SubClass; 

và sau đó bạn có thể làm

SuperClass.prototype.theMethod.apply(this); 

từ bên trong một lớp con thực hiện cụ thể gọi thực hiện của siêu.

+0

Đối với những người, như tôi, đã đặt câu hỏi về sự khác biệt giữa cách tiếp cận này và lời kêu gọi trong câu trả lời, câu trả lời ngắn gọn là không có gì. Câu trả lời dài được cung cấp bởi mozilla ở đây ... https: //developer.mozilla.org/en-US/tài liệu/Web/JavaScript/Tham chiếu/Global_Objects/Chức năng/áp dụng – Jackie

0

Nó sẽ có thể để lưu trữ các giá trị cũ của phương pháp load trong một đóng cửa, nếu bạn đã làm trọng bạn như thế này:

function Widget() { 
    this.id = new Date().getTime(); 
    // other fields 
} 

Widget.prototype = { 
    load: function(args) { 
     // do something 
     alert("Widget Prototype Load"); 
    } 
}; 

function SpecialWidget(){ 
}; 

SpecialWidget.prototype = new Widget(); 

(function(){ 
    var oldLoad = SpecialWidget.prototype.load; 
    SpecialWidget.prototype.load = function(){ 
     oldLoad(); 
     alert("new Load"); 
    }; 
}()); 


var x = new SpecialWidget(); 
x.load(); 

Nó hoạt động, nhưng tôi không chắc chắn nếu đó là phương pháp tốt nhất .

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