⑴ js創建對象的幾種方法
1.對象字面量。
var clock={
hour:12,
minute:10,
second:10,
showTime:function(){
alert(this.hour+":"+this.minute+":"+this.second);
}
}
clock.showTime();//調用
2.創建Object實例
var clock = new Object();
clock.hour=12;
clock.minute=10;
clock.showHour=function(){alert(clock.hour);};
clock.showHour();//調用
由此可見 屬性是可以動態添加,修改的
對象創建模式:
1.工廠模式:就是一個函數,然後放入參數,返回對象,流水線工作
function createClock(hour,minute,second){
var clock = new Object();
clock.hour=hour;
clock.minute=minute;
clock.second=second;
clock.showHour=function(){
alert(this.hour+":"+this.minute+":"+this.second);
};
return clock;
};
var newClock = createClock(12,12,12);//實例化
newClock.showHour();//調用
優點:總算優點抽象的概念了。但是不能識別對象的類型呢!
2.構造函數模式
function clock(hour,minute,second){
this.hour = hour;
this.minute = minute;
this.second = second;
this.showTime = function(){
alert(this.hour+":"+this.minute+":"+this.second);
}
}
var newClock =new clock(12,12,12);
alert(newClock.hour);
注意:這個new關鍵字是必須,如果不加,clock就不會當成構造函數調用,而只是一個普通的函數。同時,還會意外地給他的外部作用域即window添加屬性,因為此時構造函數內部的this已經映射到了外部作用域了。所以為了安全起見,可以這樣創建
function clock(hour,minute,second){
if(this instanceof clock){
this.hour = hour;
this.minute = minute;
this.second = second;
this.showTime = function(){
alert(this.hour+":"+this.minute+":"+this.second);
}
}
else{
throw new Error("please add 'new' to make a instance");
}
}
構造函數的缺點:由於this指針在對象實例的時候發生改變指向新的實例。這時新實例的方法也要重新創建,如果n個實例就要n次重建相同的方法。於是讓來揭開原型模式吧
3.原型模式
function clock(hour,minute,second){
}
clock.prototype.hour=12;
clock.prototype.minute=12;
clock.prototype.second=12;
clock.prototype.showTime=function(){
alert(this.hour+":"+this.minute+":"+this.second);
}
var newClock = new clock();
newClock.showTime();
深度理解原型模型很重要,
首先,每個函數都有一個prototype(原型)屬性,這個指針指向的就是clock.prototype對象。而這個原型對象在默認的時候有一個屬性constructor,指向clock,這個屬性可讀可寫。而當在實例化一個對象的時候,實例newClock除了具有構造函數定義的屬性和方法外(注意,只是構造函數中的),還有一個指向構造函數的原型的指針,ECMAScript管他叫[[prototype]],這樣實例化對象的時候,原型對象的方法並沒有在某個具體的實例中,因為原型沒有被實例。(廢話有點多,沒有誤導您吧。別暈)
所以這種模式定義的對象,在調用方法的時候過程:調用newClock.showTime();先看實例中有沒有,有調之,無追蹤到原型,有調之,無出錯,調用失敗。
當然可以這樣寫:
function clock(hour,minute,second){
}
clock.prototype={
constructor:clock, //必須手動設置這個屬性,不然就斷了與構造函數的聯系了。沒有實例共享原型的意義了。
hour:12,
minute:12,
second:12,
showTime:function(){
alert(this.hour+":"+this.minute+":"+this.second)
}
}
var newClock = new clock();
newClock.showTime();
注意:實例與構造函數原型的聯系也是通過指針來聯系的,故可以動態添加修改原型的方法。
這種純原型的模式問題也很明顯,所有的屬性,方法都是共享的,不能讓對象具體化。常常想每個對象有自己的屬性。於是,結合前兩種,產生新的模式
4.構造-原型組合模式。
function clock(hour,minute,second){
this.hour = hour;
this.minute = minute;
this.second = second;
}
clock.prototype.showTime=function(){alert(this.hour+":"+this.minute+":"+this.second);}
var newClock = new clock(12,12,12);
newClock.showTime();
這里將屬性放在構造函數中,更顯得對象的具體性。
⑵ js對象的構造和繼承實現代碼
復制代碼
代碼如下:
<script>
//定義js的user對象
function
User(name,age){
this.name=name,
this.age=age,
this.getName=function(){
return
this.name;
},
this.getAge=function(){
return
this.age;
}
}
//實例化一個對象
var
use=new
User("aa",21);
alert(use.name);
alert(use.getAge());
//js對象繼承
/*
jb51.net
在面向對象的編程方法中,對象繼承是必不可少的,那麼怎麼在javascript中實現繼承機制呢。由於javascript並不是一個嚴格的面向對象的語言,因此在對象繼承上也顯的不一樣。我們也來創建一個基類Polygon,代表一個多邊形,一個多邊形有個共同的屬性就是邊數(sides)和一個共同的方法計算面積(getAreas)。這樣我們的這具Polygon類看起來就像下面這樣定義:
*/
function
Polygon(iSides){
this.sides
=
iSides;
}
Polygon.prototype.getAreas
=
function(){
return
0;
}
/*
因為基類並不能確定面積,因此在這里我們返回為0。
接著我們就創建一個子類Triangle,一個三角形,顯然這個三角形是要從多邊形繼承的,因此我們要讓這個Triangle類繼承Polygon類,並且要覆蓋Polygon類的getAreas方法來返回三角形的面積。我們來看下在javascript中的實現:
*/
function
Triangle(iBase,
iHeight){
Polygon.call(this,3);
//在這里我們用Polygon.call()來調用Polygon的構造函數,並將3作為參數,表示這是一個三角形,因為邊是確定的,所以在子類的構造函數中就不需要指定邊了
this.base
=
iBase;
//三角形的底
this.height
=
iHeight;
//三角形的高
}
Triangle.prototype
=
new
Polygon();
Triangle.prototype.getAreas
=
function(){
return
0.5
*
this.base
*this.height;
//覆蓋基類的getAreas方法,返回三角形的面積
}
/*
參考上面的實現,我們再定義一個矩形:
*/
function
Rectangle(iWidth,
iHeight){
Polygon.call(this,4);
this.width
=
iWidth;
this.height
=
iHeight;
}
Rectangle.prototype
=
new
Polygon();
Rectangle.prototype.getAreas
=
function(){
return
this.width
*
this.height;
}
/*
好了,上面我們定義了一個基類和兩個子數,下面我們來測試一個這兩個子類是否能正常工作:
*/
var
t
=
new
Triangle(3,6);
var
r
=
new
Rectangle(4,5);
alert(t.getAreas());
//輸出9說明正確
alert(r.getAreas());
//輸出20說明正確
</script>
⑶ 我用Javascript在網頁里實例化一個對象,我想再銷毀這個對象,像沒有實例化過一樣,請問該怎麼做
應該是obj=null;對象還存在是因為null也是一個對象,用typeof檢測null,返回object,給對象賦null,他已經為空了,如果你覺得按此方法obj還存在的話,你可以檢測obj的方法和屬性,應該不在的;
<script type="text/javascript">
var x=new Object();
x.a="ddd";
window.onload=function(){
//x=null; 去掉注釋再試試
alert(x.a);
}
</script>
⑷ js里為什麼實例化的對象沒有prototype屬性
自從有了Ajax這個概念,JavaScript作為Ajax的利器,其作用一路飆升。JavaScript最基本的使用,以及語法、瀏覽器對象等等東東在這里就不累贅了。把主要篇幅放在如何實現JavaScript的面向對象編程方面。 1. 用JavaScript實現類 JavaScritpt沒有專門的機制實現類,這里是藉助它的函數允許嵌套的機制來實現類的。一個函數可以包含變數,又可以包含其它函數,這樣,變數可以作為屬性,內部的函數就可以作為成員方法了。因此外層函數本身就可以作為一個類了。如下:function myClass()這里 myClass就是一個類。其實可以把它看成類的構造函數。至於非構造函數的部分,以後會詳細描述。 2. 如何獲得一個類的實例 實現了類就應該可以獲得類的實例,JavaScript提供了一個方法可以獲得對象實例。即 new操作符。其實JavaScript中,類和函數是同一個概念,當用new操作一個函數時就返回一個對象。如下:var obj1 = new myClass(); 3. 對象的成員的引用 在JavaScript中引用一個類的屬性或方法的方法有以下三種。 1> 點號操作符 這是一種最普遍的引用方式,就不累贅。即如下形式:對象名.屬性名;對象名.方法名; 2> 方括弧引用 JavaScript中允許用方括弧引用對象的成員。如下:對象名["屬性名"];對象名["方法名"]; 這里方括弧內是代表屬性或方法名的字元串,不一定是字元串常量。也可以使用變數。這樣就可以使用變數傳遞屬性或方法名。為編程帶來了方便。在某些情況下,代碼中不能確定要調用那個屬性或方法時,就可以採用這種方式。否則,如果使用點號操作符,還需要使用條件判斷來調用屬性或方法。 另外,使用方括弧引用的屬性和方法名還可以以數字開頭,或者出現空格,而使用點號引用的屬性和方法名則遵循標示符的規則。但一般不提倡使用非標示符的命名方法。 3> 使用eval函數 如果不希望使用變數傳遞變數或方法名,又不想使用條件判斷,那麼eval函數是一個好的選擇。eval接收一個字元串類型的參數,然後將這個字元串作為代碼在上下文中執行,返回執行的結果。這里正是利用了eval的這一功能。如下:alert(eval("對象名." + element.value)); 4. 對對象屬性,方法的添加、修改和刪除操作 JavaScript中,在生成對象之後還可以為對象動態添加、修改和刪除屬性和方法,這與其它面向對象的語言是不同的。  
如果幫助到您,請記得採納為滿意答案哈,謝謝!祝您生活愉快! vae.la
⑸ Js面向對象有幾種方式
對象的字面量 var obj = {}
創建實例對象 var obj = new Object();
原型模式:function clock(hour){} fn.prototype.hour = 0; new clock(); 首先,每個函數都有一個prototype(原型)屬性,這個指針指向的就是clock.prototype對象。而這個原型對象在默認的時候有一個屬性constructor,指向clock,這個屬性可讀可寫。而當我們在實例化一個對象的時候,實例newClock除了具有構造函數定義的屬性和方法外(注意,只是構造函數中的),還有一個指向構造函數的原型的指針,ECMAScript管叫[prototype]],這樣實例化對象的時候,原型對象的方法並沒有在某個具體的實例中,因為原型沒有被實例。
構造函數模式 function fn(){} , new fn();
工廠模式:用一個函數,通過傳遞參數返回對象。function fn(params){var obj =new Object();obj.params = params; return obj;},fn(params);
⑹ javascript里實例化後的對象還是實例么
關於復js中實例和對象的解釋如下制:
比如定義persion如下:
var person = new Object();
var person = {};
JS 是基於原型的面向對象語言, 所有數據都可以當作對象處理,所以 person 是對象, 可以把它當作是 Object 的實例. 當然, 一切都是對象。
第二個採用對象字面量的方式生成的person也是如此。
然而它內部沒有調用new Object(),而是採用JSON的初始化方式:
將現有的引用指向person。
實例和對象的區別,從定義上來講:
1、實例是類的具象化產品,
2、而對象是一個具有多種屬性的內容結構。
實例都是對象,而對象不全是實例。
Js裡面沒有類(ES6以前)的語法,所以類的概念就通過創造一個對象來實現。