2013-04-23 109 views
8

分配樣機我有這樣的代碼:內部構造

var MyClass = function(b) { 
    this.a = b; 
    this.getA = function() { 
     return that.a; 
    } 
} 

var SecondClass = function(b) { 
    this.prototype = new MyClass(b); 
    this.getB = function() { 
     return 6; 
    } 
} 

var a = new SecondClass(2); 
console.log(a.getA()); 

輸出告訴我,一個沒有叫木屐()方法

我認爲做this.prototype =新MyClass的()裏面的SecondClass的構造函數會導致它從MyClass中竊取方法?

我確定有更好的方法來做到這一點,但我想了解prototype關鍵字的行爲。

+1

「原型」不是關鍵字。 – Pointy 2013-04-23 15:56:43

+1

'return that.a;'應該是'return this.a;'btw。 – 2013-04-23 16:05:37

回答

11

prototype構造函數的一個特殊的屬性,而不是實例的。

當你調用與new Func()的構造函數,該引擎將創建新的對象,從Func.prototype繼承,然後設置this的構造函數中引用新的對象。

所以,除了this.prototype只是一個普通的屬性,繼承已經發生在分配發生時。

由於您沒有將任何方法分配給MyClass.prototype,因此您無需在此處進行任何原型繼承。所有你需要做的就是應用MyClass使用.call[MDN]新創建的實例:

var SecondClass = function(b) { 
    MyClass.call(this, b); 
    this.getB = function() { 
     return 6; 
    } 
}; 

然而,你應該add all methods that are shared by instances to the prototype然後讓SecondClass繼承的每個實例從它。這是一個完整的設置就怎麼看起來像:

var MyClass = function(b) { 
    this.a = b; 
} 
MyClass.prototype.getA = function() { 
    return this.a; 
}; 

var SecondClass = function(b) { 
    // call parent constructor (like 'super()' in other languages) 
    MyClass.call(this, b); 
} 
// Setup inheritance - add 'MyClass.prototype' to the prototype chain 
SecondClass.prototype = Object.create(MyClass.prototype); 
SecondClass.prototype.getB = function() { 
    return 6; 
}; 

var a = new SecondClass(2); 
console.log(a.getA()); 

這一切will become easier in ES6的。

+1

謝謝,這有助於使事情變得更清晰。爲了澄清,我假設MyClass.protoype只是Object的一個實例。所以當我將東西分配給MyClass時。原型只將它們分配給對象的特定實例(即MyClass的原型),而不是對象「類」本身。謝謝 – user350325 2013-04-23 16:34:43

+0

是的,正是...... – 2013-04-23 16:45:48

3

稱爲「原型」的屬性只對作爲函數的對象感興趣。在你的構造函數中賦值給「prototype」屬性不起作用(在這種情況下);重要的是構造函數本身的「原型」屬性。

SecondClass.prototype = new MyClass(); 

什麼的。構造函數的原型對象在構造的所有實例之間共享,因此通過構造函數參數來改變原型也沒有多大意義。

另一件事你可以做的是來自內部的「二等」所說的「MyClass的」構造:

function SecondClass(b) { 
    MyClass.call(this, b); 
    this.getB = function() { 
    return 6; 
    }; 
} 

這將有可能使該公司在new SecondClass()調用構造this的效果由裝飾「MyClass」構造函數。這不會是繼承,但你會得到一個「getA」函數。