2015-12-10 69 views
1

把我想要的東西寫入文字是非常困難的,所以我寫了一個JS範例來幫助理解。如何擴展一個JavaScript原型對象兩次?

http://jsfiddle.net/w8Lfyxtr

// create animal class 
    var animal = function(name) { 
    this.name = name; 
    }; 

    animal.prototype.getSound = function() { 
    return this.sound === undefined ? 'nothing' : this.sound; 
    }; 


    // create animal type classes 
    var dog = new animal("dog"); 
    dog.prototype.sound = "woof"; 

    var cat = new animal("cat"); 
    dog.prototype.sound = "meow"; 

    var worm = new animal("worm"); 


    // create specific animals 
    var spot = new dog(); 
    var mittens = new cat(); 
    var squiggles = new worm(); 

我想創建一個JavaScript函數的實例和原型多次延長,這樣,在我的例子,具體的動物有方法及其屬一般動物王國兩者的性質。

不幸的是,它出現在第一個實例後,原型屬性不再存在。我不想繼續擴展它,以便主要原型具有所有動物的所有方法,蠕蟲和狗應該能夠擁有.dig(),並且貓應該能夠擁有.climb()而沒有其他類具有這些方法。

相反,我不想不斷地將方法重新綁定到每個實例。連指手套的貓應該與貓類具有相同的原型,並且應該具有與克魯克山貓完全相同的功能對象,而不需要做任何額外的分配工作。

我如何用我的例子來實現這個?

+1

這是很難用語言來表達的原因,但儘量使用'Object.create' :http://jsfiddle.net/ykurmangaliyev/w8Lfyxtr/3/。 –

+0

非常有趣。那個實例化另一個原型呢? – Josh

+0

這兩篇文章可能會讓你感興趣:http://stackoverflow.com/questions/13040684/javascript-inheritance-object-create-vs-new和http://stackoverflow.com/questions/4166616/understanding-the-區別對象創建和新功能 –

回答

1

而是創建特定動物的實例,即:new animal('dog'); 創建狗的構造:

var Dog = function() { 
    this.sound = 'woof'; 
}; 
Dog.prototype = animal.prototype; 
new Dog(); 

對象有沒有原型屬性,只有功能確實有。

您還可以使用的Object.create:

Dog.prototype = Object.create(animal.prototype); 
+0

「狗構造函數」是一個了不起的術語。我會試試看。 – Josh

+0

看來,只是手動定義原型是根據我收到的所有信息實現我想要的最直接的方式。 – Josh

0

這可能會爲你的需求是合適的:

// create animal class 
    var animal = function(name) { 
    this.name = name; 
    }; 

    animal.prototype.getSound = function() { 
    return this.sound === undefined ? 'nothing' : this.sound; 
    }; 

    var digger = function(name) { 
    animal.call(this, name); 
    this.dig = function() { 
     ... 
    }; 
    } 

    var climber = function(name) { 
    animal.call(this, name); 
    this.climb = function() { 
     ... 
    }; 
    } 

    var dog = function() { 
    } 

    var cat = function() { 
    } 

    var worm = function() { 
    } 

    digger.prototype = new animal(); 
    digger.prototype.constructor = digger; 

    climber.prototype = new animal(); 
    climber.prototype.constructor = climber; 

    dog.prototype = new digger("dog"); 
    dog.prototype.constructor = dog; 
    dog.prototype.sound = "woof"; 

    cat.prototype = new climber("cat"); 
    cat.prototype.constructor = cat; 
    cat.prototype.sound = "meow"; 

    worm.prototype = new digger("worm"); 
    worm.prototype.constructor = worm; 

    // create specific animals 
    var spot = new dog(); 
    var mittens = new cat(); 
    var squiggles = new worm();