//定義一個建構函數,用來產生對應的對象,可以類比Java中的建構子function Person(name, age){ //當呼叫new Person的時候,在執行第一行程式碼前,先生成一個Person對象,並將對像在記憶體中的//索引賦值給this關鍵字,此時可以透過this關鍵字操作新產生的對象,如下面的新增屬性或方法"/> //定義一個建構函數,用來產生對應的對象,可以類比Java中的建構子function Person(name, age){ //當呼叫new Person的時候,在執行第一行程式碼前,先生成一個Person對象,並將對像在記憶體中的//索引賦值給this關鍵字,此時可以透過this關鍵字操作新產生的對象,如下面的新增屬性或方法">

首頁 >web前端 >js教程 >利用建構函數方法來建立javascript物件類別實例程式碼詳解

利用建構函數方法來建立javascript物件類別實例程式碼詳解

伊谢尔伦
伊谢尔伦原創
2017-07-24 15:33:151219瀏覽

建構函數方式 

<script type="text/javascript"> 
//定义一个构造函数,用来生成对应的对象,可以类比Java中的构造函数 
function Person(name, age){ 

//当调用new Person的时候,在执行第一行代码前,先生成一个Person对象,并将对象在内存中的 
//索引赋值给this关键字,此时可以通过this关键字操作新生成的对象,如下面的添加属性或方法 

this.name = name; //this关键字不能少。为当前对象,即this关键字引用的对象的name属性赋值 
//,实际相当于为当前对象添加name属性后,再为其name属性赋值。 
this.age = age; 

this.showName = function(){ //为当前对象添加方法 
alert(this.name); 
} 
this.showAge = function(){ 
alert(this.age); 
} 

//将当前对象返回给赋值符号左边的变量(不必明确使用return) 
} 

var obj1 = new Person("Koji", 22); //生成一个Person对象 
var obj2 = new Person("Luo", 21); 

obj1.showName(); //Koji 
obj1.showAge(); //22 
obj2.showName(); //Luo 
obj2.showAge(); //21 

</script>

建構函數的方式和工廠方式一樣,會為每個物件建立獨享的函數物件。當然也可以將這些函數物件定義在建構函式外面,這樣又有了物件和方法相互獨立的問題。 原型方法:此方法利用的物件的prototype屬性 

<script type="text/javascript"> 
function Person(){} //定义一个空构造函数,且不能传递参数 

//将所有的属性的方法都赋予prototype属性 

Person.prototype.name = "Koji"; //添加属性 
Person.prototype.age = 22; 

Person.prototype.showName = function(){ //添加方法 
alert(this.name); 
} 

Person.prototype.showAge = function(){ 
alert(this.age); 
} 

var obj1 = new Person(); //生成一个Person对象 
var obj2 = new Person(); 

obj1.showName(); //Koji 
obj1.showAge(); //22 
obj2.showName(); //Koji 
obj2.showAge(); //22 

</script>

當產生Person物件的時候prototype的屬性都賦值給了新的物件。那麼屬性和方法是共享的該方法的問題首先是構造函數不能傳參,每個新產生的物件都有預設值。其次,方法共享沒有 
任何問題,但是屬性共享就有問題,當屬性是可改變狀態的物件的時候。

<script type="text/javascript"> 
function Person(){} //定义一个空构造函数,且不能传递参数 

Person.prototype.age = 22; 
Person.prototype.array = new Array("Koji", "Luo"); 

Person.prototype.showAge = function(){ 
alert(this.age); 
} 

Person.prototype.showArray = function(){ 
alert(this.array); 
} 

var obj1 = new Person(); //生成一个Person对象 
var obj2 = new Person(); 

obj1.array.push("Kyo"); //向obj1的array属性添加一个元素 

obj1.showArray(); //Koji,Luo,Kyo 
obj2.showArray(); //Koji,Luo,Kyo 

</script>

上面的程式碼透過obj1向obj1的屬性array添加元素的時候,obj2的arra屬性的元素也跟著受到影響,原因就在於obj1和obj2對象的array屬性引用的是同一個Array對象,那麼改變這個Array對象,另一個引用該Array物件的屬性自然也會受到影響 

混合的建構子/原型方式 

使用建構子定義物件的屬性,使用原型( prototype)定義物件的方法,這樣就可以做到屬性 私有,而方法共享。 

<script type="text/javascript"> 
function Person(name, age) { 
this.name = name; 
this.age = age; 
this.array = new Array("Koji", "Luo"); 
} 

Person.prototype.showName = function() { 
alert(this.name); 
} 

Person.prototype.showArray = function() { 
alert(this.array); 
} 

var obj1 = new Person("Koji", 22); //生成一个Person对象 
var obj2 = new Person("Luo", 21); 

obj1.array.push("Kyo"); //向obj1的array属性添加一个元素 

obj1.showArray(); //Koji,Luo,Kyo 
obj1.showName(); //Koji 
obj2.showArray(); //Koji,Luo 
obj2.showName(); //Luo 

</script>

屬性私有後,改變各自的屬性不會影響別的物件。同時,方法也是由各個物件共享。在語意上,這符合了面相物件程式設計的要求。 

#

以上是利用建構函數方法來建立javascript物件類別實例程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn