2015-09-01 78 views
1

我是JavaScript新手,如果我誤解了一個概念,請隨時告訴我。如何在這種情況下覆蓋屬性

我有下面的類:

var Human = function() {}; 
Object.defineProperty(Human.prototype, 'name', { 
    get: function() { return this._name; }, 
    set: function (value) { this._name = value; }, 
    configurable: true, 
    enumerable: true 
}); 

我再定義以下子對象:

var Man = function() {}; 
Man.prototype = new Human(); //Am I inherting Human's prototype (and properties) here? 
Man.prototype.name = 'Matt'; //If so, I should be setting Man's name property (overriding the value inherited from Human) 

然而,console.log(Man.name)打印出""

爲什麼會這樣,我該如何正確覆蓋Human的屬性?

PS

我也曾嘗試

Man.name = 'Matt'; 

,而不是

Man.prototype.Name = 'Matt'; 

但我得到了同樣的行爲。

Ps2的:

我還應該注意的是,如果我執行console.log(Man.prototype._name)我得到的預期輸出"Matt"

+0

'Man.name'是_function name_,它與'name'屬性無關。如果你做了'var Man = function someName(){};','Man.name'就是''someName「'。無論如何,你的預期行爲到底是什麼? – Xufox

回答

2

既然你設置原型屬性,你需要從這個構造函數實例化一個新的對象,然後原型將被用來構造新的對象實例:

var Man = function() {}; 
Man.prototype = new Human(); 
Man.prototype.name = 'Matt'; 

var man = new Man(); // <--- this is new man 
console.log(man.name); 

然而,你可能不希望所有Man斯塔ncies有相同的名字 - 當你把東西放在prototype時會發生什麼,它會被所有的實例共享。這使得更多的意義:

var Man = function() {}; 
Man.prototype = new Human(); 

var man = new Man(); 
man.name = 'Matt'; 
console.log(man.name); 

在這裏,你只設置對象man自己財產。

+0

這是我想要達到的確切行爲。在超類中定義一個屬性並將其覆蓋在子級中。謝謝! –