2012-06-19 9 views
6

Trong C#, chúng tôi có khái niệm về phương pháp trừu tượng và cách áp dụng phương thức này trong Javascript. Ví dụ: Tôi có ví dụ:Cách áp dụng chức năng ảo trong javascript

function BaseClass() { 
    this.hello = function() { 
     this.talk(); 
    } 
    this.talk = function() { 
     alert("I'm BaseClass"); 
    } 
}; 

function MyClass() { 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
    BaseClass.call(this); 
}; 

MyClass.prototype = new BaseClass(); 

var a = new MyClass(); 
a.hello();​ 

Cách hàm hello() trong BaseClass gọi hàm do() từ MyClass khi đối tượng là đối tượng của MyClass. Kết quả cảnh báo phải là "Tôi là MyClass". Làm ơn giúp tôi. Cảm ơn.

+2

Tôi nghĩ rằng bạn có nghĩa là 'virtual' /' override', không phải 'abstract'. – HackedByChinese

+0

Có, hàm của cơ sở phải là hàm ảo để lớp kế thừa có thể ghi đè lên nó. –

+0

Tôi không chắc mình hiểu. Chỉ cần loại bỏ 'BaseClass.call (this);' dòng và nó hoạt động, vì 'this.talk = ...' ghi đè phương thức cơ sở. Hoặc bạn có thể bắt đầu 'MyClass' với' BaseClass.call (...) '(lúc đầu, không phải là kết thúc). Nhưng nếu bạn đang sử dụng 'call' thì không cần xác định nguyên mẫu. – freakish

Trả lời

7

Bạn có thể muốn gọi là "cơ sở" xây dựng đầu tiên:

function MyClass() { 
    BaseClass.call(this); 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
} 

khác BaseClass.talk sẽ ghi đè lên MyClass.talk.

Như một lưu ý phụ, việc sử dụng khái niệm "các lớp" trong javascript là khá phản tác dụng, bởi vì đây không phải là cách ngôn ngữ này hoạt động. JS sử dụng thừa kế nguyên mẫu, tức là, bạn lấy được các đối tượng mới từ các đối tượng khác, không phải từ "các lớp". Ngoài ra, mọi hàm trong JS là "ảo" theo nghĩa C++, bởi vì con trỏ this của nó phụ thuộc vào cách hàm được gọi, chứ không phải ở vị trí được xác định.

4

Bạn đang trọng chức năng của bạn bằng cách làm BaseClass.call(this);

function MyClass() { 
    //BaseClass.call(this); // Not really necessary unless you run code inside your base class 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
}; 

Điều này sẽ làm cho công việc mã của bạn. Các MyClass.prototype = new BaseClass(); nên làm cho các chức năng hello có sẵn trên đối tượng a của bạn.

4

Vấn đề là bạn đang thực sự xác định phương pháp cá thể riêng, trong cả hai nhà thầu MyClassBaseClass. Điều này ghi đè tra cứu phương thức mẫu thử, vì phương thức talk không nằm trong nguyên mẫu nhưng là thuộc tính mẫu thực tế và hàm tạo BaseClass được gọi sau hàm tạo MyClass, do đó ghi đè thuộc tính talk.

Demonstration với kế thừa nguyên mẫu thực tế.