2011-04-16 56 views
2

這聽起來比應該更容易,但我在嘗試解決此問題時遇到問題。我的情況基本上是,我可以創建一個將使用原型的類(例如:function exClass() {})。JavaScript - 嘗試從原型中添加原型

如果我想添加到班級,我可以使用:exClass.prototype.newMethod() = '';。那麼爲什麼如果我在例如原型「newMethod」中,我不能再爲「exClass」添加一個新的原型。我的意思是:this.prototype.test_var1 = '' - 它失敗,exClass.test_var1也是如此。

爲什麼我無法從其中一個子類中添加更多類?

回答

2

您無法通過this.prototype獲取對象的父級原型。您必須使用this.constructor.prototype(儘管這會影響該類型的所有對象的行爲,在這種情況下爲exClass)。這段代碼會提醒'你好世界'。

function exClass() {}; 

exClass.prototype.newMethod = function() { 
    this.constructor.prototype.test_var1 = 'hello world'; 
} 

obj = new exClass(); 
obj.newMethod(); 
alert(obj.test_var1); 
4

物體的原型是被叫prototype的對象屬性。函數的原型字段是將成爲使用該函數創建的對象的原型的對象。一個對象可以訪問通過constructor函數創建它的函數的原型。例如,在大多數情況下,this.constructor.prototype.test_var1 = ''都可以使用。

我說在大多數情況下,因爲許多JavaScript引擎內置__proto__是對象的原型,可以在運行中修改,但在IE中不支持這種情況。

在ES5中,您可以使用Object.getPrototypeOf()來可靠地獲取原型。例如,你可以說,ES5中的Object.getPrototypeOf(this).test_var1 = ''可以在現代瀏覽器中工作,但不支持沒有ES5的瀏覽器。

3

構造函數exClass不是指同一個對象作爲實例exClass,這裏面有什麼newMethodthis引用的prototype屬性的prototype財產。證明:

function exClass() {} 
exClass.prototype.newMethod = function() { 
    console.log(this.prototype === exClass.prototype); // false 
    console.log(this.prototype); // undefined 
} 

var obj = new exClass(); 
obj.newMethod(); 

輸出:

false 
undefined 

更一般地,在JavaScript中每個對象都有一個原型對象。函數的prototype屬性指定原型對象將用於使用該函數創建的對象的類別。

沒有什麼能阻止你從另一個函數中的一個函數的prototype修改:

exClass.prototype.newMethod = function() { 
    exClass.prototype.anotherMethod = function() {} 
} 

或者更一般地:

exClass.prototype.newMethod = function() { 
    this.constructor.anotherMethod = function() {} 
} 

但我不會推薦它。