2010-03-03 100 views
5

Vì vậy, tôi đã đọc trên số blog của John Resig, thấy số micro-templating javascript engine của mình và quyết định thử và triển khai hệ thống quản lý mẫu của riêng tôi cho javascript. . Tuy nhiên, phút tôi bắt đầu viết nó, tôi đã gặp rắc rối.Làm thế nào để bạn gọi hàm đối tượng cha từ đối tượng con trong javascript

Để bắt đầu, đây là mã cơ sở của tôi:

function template_manager() { }; 

template_manager.prototype = { 
    tags: {}, 
    templates: {}, 
    output: {}, 
    default_template: "default", 
    set: function (tags, template_name) { 
     template_name = "Greetings!"; 
     //template_name = this._util.template(this.nothing, this.default_template); 
     console.log(template_name); 
    }, 
    get: function(tags, template_name) { 
     console.log("Getting"); 
    }, 
    unset: function(tags, template_name) { 
     console.log("Removing"); 
    }, 
    render: function(template_name) { 
     console.log("Rendering"); 
    }, 
    //_util goes here 
}; 

// Take it for a quick test drive. 
test = new template_manager; 
test.set(); 
test.get(); 
test.unset(); 
test.render(); 

Sau đó, tôi bắt đầu làm việc trên một số mã thông thường, và tôi quyết định đặt nó vào một đối tượng tiện ích:

_util: { 
     // Used to set the default values for optional arguments 
     optional: function(obj, def_value) { 
      return (typeof obj === "nothing") ? obj : def_value; 
     }, 
     template: function(template_name) { 
      return this._util.optional(template_name, this.default_template); 
     }, 
    }, 

Và bây giờ , khi tôi cố gắng gọi hàm _util.template() của tôi trong hàm set() của tôi, tất nhiên tôi gặp lỗi vì this trỏ đến đối tượng _util thay vì đối tượng template_manager. Tôi đã xem xét phương pháp jQuery extend và tôi nghĩ rằng tôi hiểu nó đang làm gì. Câu hỏi của tôi là, tôi có cần cần để thực hiện/sử dụng phương thức extend của jQuery hoặc có cách nào khác để tôi gọi đối tượng template_manager từ đối tượng _util của tôi không?

(PS Tôi đã nhìn vào Douglas Crockford article trên nguyên mẫu thừa kế, và tôi nghĩ câu trả lời là có, nhưng tôi sợ tôi không hoàn toàn hiểu nó được nêu ra.)

+0

@Chris, giúp tôi không được kiểm tra kỹ. Cảm ơn vì đã bắt được điều đó! –

Trả lời

8

Bạn có thể sử dụng call hoặc apply tức

template_manager.prototype = { 
    set: function (tags, template_name) { 
     template_name = "Greetings!"; 
     template_name = this._util.optional.call(this, this.nothing, this.default_template); 
     console.log(template_name); 
    } 
} 

Xem "Getting Out of Binding Situations in JavaScript" bài viết cho lời giải thích rõ ràng hơn.

+0

Giải pháp hoạt động và bài viết thực hiện một công việc tuyệt vời giải thích phạm vi chi tiết hơn. Cảm ơn bạn rất nhiều Li0liQ! –

+0

@Sean Vieira, bạn được chào đón. – Li0liQ

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