5

Tôi đang cố gắng để có các thuộc tính kế thừa từ cha mẹ, nhưng tôi không rõ ràng về cách thực hiện đúng.Thừa kế nguyên mẫu trong JS và cách nhận các thuộc tính cha mẹ

phép nói rằng tôi có:

var Animal = function(name){ 
    this.offspring = []; 
    this.name = name; 
    return this; 
} 

Animal.prototype.createOffspring = function(name){ 
    name = name || 'Baby '+(this.offspring.length+1); 
    this.offspring.push(name); 
    return this; 
} 

Bây giờ tôi muốn thêm một nguyên mẫu kế thừa phụ vì vậy tôi không cần phải tự thêm tất cả mọi thứ từ cha mẹ. Ví dụ, cho phép nói rằng tôi muốn thêm một Cat dựa từ Animal

Tôi muốn làm điều này, như thể nó là một Animal

var pet = new Cat('Kitty'); 
pet.createOffspring(); 

Nếu không bằng tay phải thêm namecreateOffspring đến Cát constructor thực sự chỉ là một Animal, nhưng với một số chức năng bổ sung khác (như .meow() hoặc một cái gì đó).

Trả lời

4
// Parent 
function Animal() { 
    this.name = 'An animal'; 
} 

// Some child 
function Cat() { 
    this.speaks = 'Meow'; 
} 
// Here comes inheritence 
Cat.prototype = new Animal(); 
// Or like that 
// but don't forget to put all inheritable fields to Animal's prototype 
Cat.prototype = Object.create(Animal.prototype); 

// Let 'instanceof' work. Don't forget the following line, 
// because we eraese the info about constructor of Cat instances. 
Cat.prototype.constructor = Cat; 
// Add some custom method 
Cat.prototype.meow = function() { return this.speaks; } 

var cat = new Cat(); 
var animal = new Animal(); 

/// Some tests 
cat.name; // A animal 
animal.name; // An animal 
cat.meow(); // Meow! 
cat instanceof Cat; // true 
cat instanceof Animal; // true 

Vậy phải không? (UPD: Lỗi với nguyên mẫu cố định) (UPD2:. Xin lỗi Nó được khuya, tôi kiếm được nhiều sai lầm .. Tôi phải đi ngủ)


Ngoài ra còn có một giải pháp khác, nhưng Chrome của mình, FF-cụ thể (có thể là những người khác):

// Animal and Cat functions from above, but 
Cat.prototype = { 
    __proto__: Animal.prototype, 
    constructor: Cat, 
    meow: function() { ... } 
} 

Có vẻ ngắn hơn, nhưng không bị cám dỗ bởi điều này: tốt hơn là làm theo ECMAScript standart.

+0

Tôi cần kiểm tra nó, nhưng tôi muốn _not_ phải làm lại 'this.name' vì _all_ động vật sẽ có tên do đó,' this.name = 'A cat'; 'sẽ có thể bị xóa và 'cat.name' phải trả về' Một con vật ' –

+0

Ồ, xin lỗi. Tôi đánh lừa bạn nhầm câu trả lời: Animal.prototype không được thiết lập, vì vậy 'cat.name' sẽ đưa ra một ngoại lệ. Đúng cách, khi dụ được xây dựng động lực, là gán một đối tượng cho một proto: 'Cat.prototype = Object.create (new Animal())' –

+0

Điều này đã cho tôi đi đúng hướng và cảm ơn bạn rất nhiều. Xin lỗi đã mất quá lâu :) Điều duy nhất dường như lạ là 'Cat.prototype.constructor = Cat;' trong hay không trong mã hoạt động giống nhau và tôi vẫn nhận được 'true' trên' instanceof' S. Dòng 'Object.create()' làm cho 'cat.name' không xác định. http://jsbin.com/uhogig/edit#javascript,html –

0

Có một số mẫu khác nhau để triển khai kế thừa như bạn mô tả trong JavaScript và chúng có sự khác biệt nhỏ về cách xử lý đối tượng mẫu thử nghiệm.

Dưới đây là một số tài liệu tham khảo tốt trên prototype patternconstructor pattern để giúp bạn bắt đầu.

Và đây là simple implementation về những gì bạn mô tả.

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