2010-08-24 161 views
1

我是從c#面向對象的背景,並在JavaScript中工作類似的原則。任何可以幫助我研究的好文章?JavaScript對象問題

這是一個例子,我放在一起的產品Javascript對象:

function Product() { 
    this.reset = function() { 
     this.id = 0; 
     this.name = ''; 
    } 
} 

Product.prototype = { 
    loadFromJson: function (json) { 
     this.reset(); 
     this.id = json.Id; 
     this.name = json.Name; 
    }, 

checkAvailability: function (qty) { 
    // Just to illustrate 
    return true; 
} 
}; 

所以製作產品的一個實例:

var p = new Product(); 

訪問公共方法:

var isAvailable = p.checkAvailability(1); 

要訪問公共財產:

var name = p.name; 

重置函數是否創建了有效的私有函數?

是我在做什麼以上正確或有更好的方法嗎?我是新來的!另外,如果我在另一個JavaScript文件中創建一個產品的實例,我可以獲得產品對象的屬性的智能化嗎?

回答

1

重置爲this.reset();,因此它位於該對象的範圍內,因此可以被稱爲public,但仍保留在該範圍內。在你的例子中p.reset();reset();失敗。

更好的方法?這取決於,一些情況需要這個複雜的,有些則不需要。有很多方法來實例化對象(所有東西都是JavaScript中的對象),而您的示例就是其中一些方法。

除非你建立和附加你自己的(很多工作),否則不會有任何智力。 (在jQuery intellisence上進行搜索以瞭解它是如何完成的)

有關命名空間的更多信息,請參閱此處。請注意內部和公共功能和變量。

var myStuffApp = new function() 
{ 
    var internalFunction = function() 
    { 
     alert('soy una función interna'); 
    }; 
    this.publicFunction = function() 
    { 
     alert('soy una función pública'); 
    }; 
    var test1 = 'testing 1';//private/internal 
    this.test2 = 'testing 2';// namespaced 
    testA="ho";// global 
}; 
1

我建議讀這個msdn page的基本信息。這就像面向c#的開發人員的速成課程。

1

重置函數是否創建了有效的私有函數?

號它不同於上prototype設置,因爲你得到的reset不同副本的Product每個實例的功能:

var p1= new Product(); 
var p2= new Product(); 
alert(p1.loadFromJson===p2.loadFromJson); // true 
alert(p1.reset===p2.reset); // false 

但它不是私有的。你還可以這樣做:

var p= new Product(); 
p.reset(); 

雖然你可以使用閉包做私有函數在JavaScript中,它幾乎從來不值得的。考慮僅僅使用Python的約定來命名所有你不打算在實現之外使用的成員,並在前面加下劃線。

請參閱this question瞭解JS對象模型的廣泛討論。