2012-01-23 38 views
67

Tôi cần gọi phương thức initialize của lớp cha, từ bên trong lớp được thừa hưởng MyModel, thay vì ghi đè hoàn toàn nó như tôi đang làm hôm nay.Truy cập lớp cha trong Backbone

Tôi làm cách nào để thực hiện việc này?

Đây là những gì mã của tôi trông ngay bây giờ:

BaseModel = Backbone.Model.extend({ 
    initialize: function(attributes, options) { 
     // Do parent stuff stuff 
    } 
}); 

MyModel = BaseModel.extend({ 
    initialize: function() { 
     // Invoke BaseModel.initialize(); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 

Trả lời

50
MyModel = BaseModel.extend({ 
    initialize: function() { 
     MyModel.__super__.initialize.apply(this, arguments); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 
+0

Hi Raynos - Điều đó gây ra lỗi 'quá nhiều đệ quy' trong giao diện điều khiển .. – Industrial

+1

@Industrial sau đó nó làm điều gì đó ngớ ngẩn. Hãy thử 'this .__ super __. Initialize.apply (điều này, đối số);' – Raynos

+5

'__ super __' không có ý định sử dụng nó trực tiếp, như tên gạch dưới ngụ ý. –

5

Tôi nghĩ rằng nó muốn được

MyModel = BaseModel.extend({ 
    initialize: function() { 
     this.constructor.__super__.initialize.call(this); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 
+0

Đó là 'này .__ siêu __ initialize.call (this);..' – Raynos

+0

Cả hai 'này .__ siêu __ prototype.initialize.call (this); 'và' này .__ siêu __ initialize.call (this). 'ném' này .__ super__ là undefined' trong Firebug. – Industrial

+0

không ai trong số họ đang làm việc: ( –

-4

Bạn có thể xem xét viết lại mã của bạn sử dụng thừa kế chức năng.

var BackBone=function(){ 
    var that={}; 

    that.m1=function(){ 

    }; 
    return that; 

}; 

var MyModel=function(){ 

var that=BackBone(); 
var original_m1=that.m1; 

//overriding of m1 
that.m1=function(){ 
    //call original m1 
original_m1(); 
//custom code for m1 
    }; 
}; 
+0

Tôi nghi ngờ viết lại xương sống theo thứ tự ở đây :) chúng ta phải quản lý với cấu trúc xương sống cho chúng ta, và có những giải pháp tốt hơn nhiều so với viết lại tất cả điều này, giống như __super__ là quá đủ. – Sander

125

Hãy thử

MyModel = BaseModel.extend({ 
    initialize: function() { 
     BaseModel.prototype.initialize.apply(this, arguments); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 
+0

điều này xuất hiện để làm việc ngay cả khi có sự hiện diện của '_.bindAll (this)' cuộc gọi, mà làm cho tài sản '__super__' của constructor undefined. – sweaver2112

+1

tốt hơn sử dụng '__super__' có dấu gạch dưới gợi ý một thành viên riêng –

4

này có vẻ là gần như một bản sao của Super in Backbone, vì vậy bạn muốn một cái gì đó như thế này:

Backbone.Model.prototype.initialize.call(this); 
2

Tương tự như @wheresrhys, nhưng tôi sẽ sử dụng áp dụng thay vì gọi trong trường hợp BaseModel.initialize được mong đợi đối số. Tôi cố gắng tránh xử lý các bản đồ thuộc tính có thể được truyền cho một mô hình xương sống khi khởi tạo, nhưng nếu BaseModel thực sự là một khung nhìn hoặc một bộ sưu tập thì tôi có thể muốn thiết lập các tùy chọn.

var MyModel = BaseModel.extend({ 
    initialize: function() { 
     this.constructor.__super__.initialize.apply(this, arguments); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 
+0

FWIW Jeremy Ashkenas [** tiểu bang **] (https://github.com/jashkenas/backbone/pull/787#issuecomment-3143358) rằng' __super__' không có ý định sử dụng trực tiếp. – MikeSchinkel

0

đây là phương thức callSuper đa thế hệ, chỉ cần thêm nó vào lớp mở rộng của bạn.

callSuper: function (methodName) { 
    var previousSuperPrototype, fn, ret; 

    if (this.currentSuperPrototype) { 
     previousSuperPrototype = this.currentSuperPrototype; 
     // Up we go 
     this.currentSuperPrototype = this.currentSuperPrototype.constructor.__super__; 
    } else { 
     // First level, just to to the parent 
     this.currentSuperPrototype = this.constructor.__super__; 
     previousSuperPrototype = null; 
    } 

    fn = this.currentSuperPrototype[methodName]; 

    ret = (arguments.length > 1) ? fn.apply(this, Array.prototype.slice.call(arguments, 1)) : fn.call(this); 

    this.currentSuperPrototype = previousSuperPrototype; 

    return ret; 
} 
Các vấn đề liên quan