2013-02-21 34 views
19

Tôi đang chơi với util.inheritsmethod from node.js và dường như không thể có được hành vi mong muốn.util.inherits - cách gọi phương thức siêu ví dụ?

var util = require("util"); 

function A() { 
    this.name = 'old'; 
} 

A.prototype.log = function(){ 
    console.log('my old name is: '+ this.name); 
}; 

function B(){ 
    A.call(this); 
    this.name = 'new'; 
} 

util.inherits(B, A); 

B.prototype.log = function(){ 
    B.super_.prototype.log(); 
    console.log('my new name is: ' + this.name); 
} 

var b = new B(); 
b.log(); 

Kết quả là:

my old name is: undefined 
my new name is: new 

Tuy nhiên những gì tôi muốn là:

my old name is: new 
my new name is: new 

tôi thiếu gì?

Trả lời

38

Dưới đây là làm thế nào để đạt được những gì bạn đang tìm kiếm:

B.prototype.log = function() { 
    B.super_.prototype.log.apply(this); 

    console.log('my new name is: ' + this.name); 
}; 

Điều này đảm bảo bối cảnh this là trường hợp của B thay vì B.super_.prototype Tôi cho rằng.

+8

Cách khác: B.super_.prototype.log.call (this); – Klaasvaak

+1

Btw cuộc gọi là sự lựa chọn tốt hơn .. http://jsperf.com/function-calls-direct-vs-apply-vs-call-vs-bind/6 – korCZis

+2

Tôi thích sử dụng từ khóa 'this':' this .constructor.super_.prototype.log.call (this) ', do đó bạn không cần phải sử dụng tên lớp một lần nữa trong phương pháp – kit

0

Tôi muốn gọi phương thức siêu qua prototype chain thay vì constructor chain như sau.

var prototype = C.prototype; 

prototype.log = function() { 
    Object.getPrototypeOf(prototype).log.call(this) 

    // or old style 
    prototype.__proto__.log.call(this) 
} 

Họ đều là tiếp cận đối tượng nguyên mẫu của siêu lớp, nhưng sử dụng prototype chain có thể là tốt hơn so với constructor.super_.prototype của constructor chain.

vì thường tôi ẩn các phương thức protected, private trong các tệp được phân tách và trong thư mục prototype. Chỉ có các phương thức public có chức năng constructor trong same scope. Ngoài ra, để giúp họ dễ dàng di chuyển quanh các lớp khác nhau. Tất cả chúng được đặt tên là prototype.method = function() {...}, vì vậy hầu hết trong số họ chỉ có thể truy cập đối tượng nguyên mẫu.

Hoặc nó sẽ được đánh giá cao để biết bất kỳ lợi ích nào để trải qua constructor chain? Đây là lý do tại sao tôi tìm thấy bài đăng này.

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