2011-08-23 64 views
0

實施例1:它是真的構造函數的原型不能覆蓋公共成員?

function Cat(){ 
    this.color = function(){ 
     return "Green"; 
    }; 
} 

Cat.prototype.color = function(){ 
    return "Blue"; 
} 

var kitty = new Cat(); 
alert(kitty.color()); // Green 

實施例2:

function Cat(){ 
    var color = function(){ 
     return "Green"; 
    }; 
} 

Cat.prototype.color = function(){ 
    return "Blue"; 
} 

var kitty = new Cat(); 
alert(kitty.color()); // Blue 

實施例2返回Blue,是因爲它的構造無法覆蓋公共成員或者它不能訪問私有成員?

+3

由於'var color = function()...'實際上並沒有將'color'函數附加到'Cat',所以示例2有缺陷。 –

+0

我認爲這不是瑕疵http://javascript.crockford.com/private.html – Kitty

+2

當你告訴人們存在「私人」變量時會發生什麼。他們不。 'color'是一個局部變量 – Raynos

回答

0

示例2對構造函數中的color沒有任何作用,因爲它不是屬性,而是其範圍內的函數。例如1,您應該認識到,查找屬性以本地屬性開始,如果沒有發現任何屬性,則繼續進行原型屬性的設置。因此,在例1的情況下,首先找到並執行本地的color-方法。本地和原型方法有不同的方法,如可以證明:

function Cat(){ 
    this.color = function(){ 
     return Cat.prototype.color ? Cat.prototype.color() : "Green"; 
    }; 
} 

Cat.prototype.color = function(){ 
    return "Blue"; 
} 

var prrr = new Cat; 
alert(prrr.color()); //=> Blue 

所以在這個意義上,回答你的問題是:是的。但不在:

function Cat(){ 
    this.color = function(){ 
     return Cat.prototype.color ? Cat.prototype.color() : "Green"; 
    }; 
} 
Cat.prototype.color = function(){ 
    if (this.color && !this.colorOverwritten) { 
     this.color = function(){return "Orange";}; 
     this.colorOverwritten = true; 
    } 
    return "Blue"; 
} 

var prrr = new Cat; 
alert(prrr.color()); //=> Blue 
alert(prrr.color()); //=> Orange 
+0

不錯的例子!感謝代碼。 – Kitty