首頁 > web前端 > js教程 > 主體

舉例說明JavaScript中關於物件操作的相關知識_基礎知識

WBOY
發布: 2016-05-16 15:32:06
原創
899 人瀏覽過

從陣列到物件

var myarr = ['red','blue','yellow','purple']; 
myarr;// ["red","blue","yellow","purple"] 
myarr[0];//"red" 
myarr[3];//"purple' 
登入後複製

 
陣列大家都很熟悉吧,我們可以理解為一個Key對應一個Value,而這個Key在數組中,已經預設了(如上述程式碼,它的key分別是0,1,2,3 value是red,blue, yellow,purple)。
那麼一個物件就可以理解為一個自訂Key的陣列。看如下碼

var hero ={ 
 breed: 'Turtle', 
 occupation:'Ninja' 
}; 
登入後複製

 
 上述程式碼我們可以了解:
 1.物件的名稱叫hero.
 2.和陣列不同的是用符號'{'取代了'['
 3.物件的屬性(如breed和occupation)用符號','分隔
 4.Key和Value的語法是 KEY:VALUE
還有需要注意到是不管屬性(也就是key)是放在雙引號,單引號,或是沒有引號,他們的結果都是一樣的,下面的程式碼是一樣的

var obj={a:1,b:2}; 
var obj={'a':1,'b':2}; 
var obj={"a":1,"b":2}; 
登入後複製

推薦的寫法是不要把屬性放在引號裡。除非屬性的名稱是特殊符號,如數字,或帶有空格等等。
 
本篇很簡單,要注意的是,定義數組的符號[] ,而定義物件的符號為{}
 
元素,屬性,方法
學習陣列的時候,我們可以說陣列裡包含了元素,當談到物件的時候,我們可以改變下說法

var animal={ 
   name: 'dog', 
   run:function(){ 
    alert("running"); 
  } 
} 
登入後複製

 name就是屬性(property),run本身是個函數,在這個物件中,我們叫方法(method)。

存取物件的屬性
有兩種方式存取物件的屬性。
用數組的形式如:animal['name']
用點的方式存取:animal.name
第一種存取方法適合任意情況。但是如果屬性是無效的命名的話,如上一節所說的屬性命名'1name'或'my name'這種情況用點的方式存取就是錯誤的。這一點要注意。
 
下面具體看一個物件存取的例子

var book = { 
  name:'Javascript Fundation', 
  published:jixie. 
  author:{ 
    firstname:'nicholas', 
    lastname:'xia' 
  } 
}; 
登入後複製

 
1.取得author物件的firstname屬性

book.author.firstname //nicholas
登入後複製

 
2.取得author物件的lastname屬性,我們嘗試用另一個寫法

book['author']['lastname'] //xia
登入後複製

我們也可以用混合的訪問方式
book.author['lastname']或book['author'].lastname 這些方式都是有效的,要靈活去運用
 
在屬性是動態的情況下,一般用陣列的存取物件的方法。

var key ='lastname' 
book.author[key];//xia 
登入後複製

呼叫物件的方法

var hero = { 
breed: 'Turtle', 
occupation: 'Ninja', 
say: function() { 
return 'I am ' + hero.occupation; 
} 
} 
hero.say(); 
登入後複製

 
存取物件的方法很簡單,有點就行,不過也可以用數組的方式,看起來比較詭異
如 hero['say']();
不建議這種寫法,訪問對象的時候盡量用點的方式。
 
修改屬性與方法
因為Javascript是動態語言,所以在任何時候都可以修改物件的屬性和方法。看如下的例子

var hero={}; 
登入後複製

 hero是個空的對象。

typeof hero.breed;//undefined 
登入後複製

 說明了hero物件沒有breed的屬性
 接下來可以加入屬性和方法了

hero.breed = 'turtle'; 
hero.name = 'Leonardo'; 
hero.sayName = function() {return hero.name;}; 
登入後複製

 呼叫方法

 hero.sayName();//Leonardo
登入後複製

 刪除屬性
 

delete hero.name;//true 
hero.sayName();//方法失败 

登入後複製

This

var hero = { 
  name : 'Rafaelo', 
  sayName : function(){ 
   return this.name;   
 } 
} 
hero.sayName();//Rafaelo 
登入後複製

 this的意思是這個物件的意思,關於this的複雜問題以後在討論。
 
建構子(Constructor Functions)
另一種創建物件的方式是用建構函數,直接看例子

function Hero(){ 
 this.name ='Refaelo'; 
} 
var hero = new Hero();
hero.name;//Refaelo
登入後複製

這種方式的好處是建立個物件的時候可以傳入參數

function Hero(name){ 
  this.name = name; 
  this.whoAreYou = function(){ 
    return this.name; 
  } 
} 
 
var hi = new Hero('nicholas'); 
hi.whoAreYou();//nicholas 
登入後複製

 要注意的時候,不要丟點 new 運算子。 。 。
全域物件
上幾節我們說過全域變數的事情,已經說過了我們要盡量避免使用全域變量,當我們學過物件的時候,我們在看看全域變數究竟怎麼回事,其實全域變數就是全域對像一個屬性了。如果主機的環境是web瀏覽器,全域變數就是window。
如果我們定義 var a = 1;
我們可以這麼理解:
一個全域變數a,
做為window的一個屬性a.我們可以這樣調用window.a或window['a']
再看看預先定義函數的parseInt('123 m');我們可以寫成window.parseInt('123 m');
 
constructor 屬性
物件建立之後,後台有建立了個隱藏屬性,constructor.

h2.constructor;//Hero(name)
登入後複製

因為constructor的屬性是對函數的參考。如果你不關心h2物件是由什麼創建的,而只關心創建一個新的物件和h2相似就用如下寫法

var h3 = h2.constructor('Nicholas'); 
h3.name ;//Nicholas 
登入後複製

我们来看看如下写法的意思

var o = {}; 
o.constructor;//Object() 
typeof o.constructor;//"functions" 
登入後複製

其实就是隐藏了 new Object() ,更深的层次应用以后几个教程在说明。

instanceof 操作符
用instanceof来判断对象是否是指定的构造函数创建的。

function Hero(){ 
} 
var h = new Hero(); 
var o = {}; 
h instanceof Hero;//true 
h instanceof Object;//false 
o instanceof Object;//true 
登入後複製


要注意的是instanceof 后面的是个引用 不是个函数 如错误写法 h instanceof Hero();//错误

函数返回对象
可以用构造函数来创建个对象,也可以通过普通函数返回对象来创建对象

function factory(name){ 
  return { 
   name:name 
 }; 
} 
登入後複製

用这个方法创建对象

var o = factory('one'); 
o.name
登入後複製


让我们接下来看看比较少见的构造函数返回对象的例子

function C(){ 
 this.a = 1; 
 return {b:2}; 
} 
 
var c2 = new C(); 
typeof c2.a //undefined 
c2.b; // 2 
登入後複製

说明了 并不返回this了 而是返回了对象{b:2}。。这点要注意

传递对象
如果传递一个对象到函数里,那么传递的是个引用。如果改变了这个引用,也就会改变原始的对象。
下面是个对象赋值的例子

var original = {name:'nicholas'}; 
var copy =original; 
copy.name;//'nicholas'; 
copy.name = 'Jason'; 
original.name;// 'Jason'; 
登入後複製


修改了copy的属性name 也就等于修改了original的属性name
对象传参到函数中,也是同样的。

function modify(o){ 
  o.name ='Jason' 
} 
var original={name:'nicholas'}; 
modify(original); 
original.name;//Jason 
登入後複製


对象的比较
两个对象的比较如果是true的话,那么他们就是同一个对象的引用。

var fido ={breed:'dog'}; 
var benji ={breed:'dog'}; 
 
benji===fido; //false; 
benji==fido; //false; 
登入後複製

 
 以上的代码都不是同一引用,所以都是false

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!