欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

初步了解javascript面向?qū)ο?/h1>
 更新時(shí)間:2015年11月09日 09:53:24   投稿:mrr  
面向?qū)ο蟮恼Z(yǔ)言有一個(gè)標(biāo)志,即擁有類(lèi)的概念,抽象實(shí)例對(duì)象的公共屬性與方法,基于類(lèi)可以創(chuàng)建任意多個(gè)實(shí)例對(duì)象,一般具有封裝、繼承、多態(tài)的特性!但JS中對(duì)象與純面向?qū)ο笳Z(yǔ)言中的對(duì)象是不同的,ECMA標(biāo)準(zhǔn)定義JS中對(duì)象:無(wú)序?qū)傩缘募?,其屬性可以包含基本值、?duì)象或函數(shù)

前言

基于類(lèi)的對(duì)象:我們都知道面向?qū)ο蟮恼Z(yǔ)言中有一個(gè)明顯的標(biāo)志,就是都有類(lèi)的概念,通過(guò)類(lèi)這個(gè)類(lèi)似模板的東西我們可以創(chuàng)建許多個(gè)具有相同的屬性和方法的對(duì)象。然而在ECMAScript中并沒(méi)有類(lèi)的概念,自然它與基于類(lèi)的語(yǔ)言中的對(duì)象也會(huì)有所不同。

js中的對(duì)象: 無(wú)序 的屬性的集合,屬性可以包含基本值、對(duì)象、函數(shù)。即js中的對(duì)象是一組沒(méi)有特定順序的值,對(duì)象的每個(gè)屬性或者方法都有一個(gè)自己的名字,而每個(gè)名字都與一個(gè)值相對(duì)應(yīng)。

理解對(duì)象

創(chuàng)建對(duì)象的方式

1 創(chuàng)建一個(gè)對(duì)象的最簡(jiǎn)單的方式是創(chuàng)建一個(gè)Object實(shí)例,之后為其添加屬性和方法。

例如

  var person = new Object();
    person.name='謙龍';
    person.sex='男';
    person.sayNameAndSex=function(){
      console.log(this.name,this.sex)
    }
    person.sayNameAndSex(); // 謙龍 男

2 使用對(duì)象字面量形式

例如

  var person={
    name:'謙龍',
    sex:'男',
    sayNameAndSex:function(){
      console.log(this.name,this.sex)
    }
  }
   person.sayNameAndSex(); // 謙龍 男

屬性的類(lèi)型

ECMAScript有兩種數(shù)據(jù)屬性:數(shù)據(jù)屬性和訪問(wèn)器屬性。

數(shù)據(jù)屬性

數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置。在這個(gè)位置可以讀取和寫(xiě)入值。共有四個(gè)描述其行為的特性。

1.[[Configurable]]:表示能否通過(guò)delete刪除屬性從而重新定義屬性...默認(rèn)值為true

2.[[Enumerable]]:表示能否通過(guò)for in 循環(huán)返回屬性...默認(rèn)為true

3.[[Writable]]:表示能否修改屬性的值...默認(rèn)為true

4.[[Value]]:表示這個(gè)屬性的值.默認(rèn)為undefined

要修改屬性默認(rèn)的特性,必須使用ES5的Object.defineProperty()方法,而該方法接收三個(gè)參數(shù):屬性所在的對(duì)象、屬性的名稱(chēng)、還有一個(gè)描述屬性特性的對(duì)象(configurable、enumerable、writable、value),設(shè)置其中的一個(gè)或者多個(gè)值可以修改對(duì)應(yīng)的特性

DEMO

var person={};
Object.defineProperty(person,'name',{
 configurable:false,//表示不允許通過(guò)delete刪除屬性
 writable:false,//表示不允許重寫(xiě)
 ennumerable:false,//表示不允許通過(guò)for in遍歷
 value:'謙龍'//設(shè)置該對(duì)象中屬性的值
})
person.name='謙龍2';//嘗試重新設(shè)置 結(jié)果不生效
delete person.name;//嘗試刪除 結(jié)果不生效
for(var attr in person){
 console.log(person[attr]);// false
}
console.log(person.name);//謙龍

注意:將 configurable 設(shè)置為false后 不允許再次修改為true,另外在調(diào)用Object.defineProperty()方法的時(shí)候,configurable、ennumerable、writable默認(rèn)值為false。

訪問(wèn)器屬性

訪問(wèn)器屬性不包含數(shù)據(jù)值,它們包含一對(duì)getter、setter函數(shù)(但是這兩個(gè)函數(shù)并不是必須的)在讀取訪問(wèn)器屬性的時(shí)候,會(huì)調(diào)用getter函數(shù),這個(gè)函數(shù)是負(fù)責(zé)返回有效的值,在寫(xiě)入訪問(wèn)器屬性的時(shí)候會(huì)調(diào)用setter函數(shù)并傳入新值,這個(gè)函數(shù)負(fù)責(zé)如何處理數(shù)據(jù)。

訪問(wèn)器屬性具有如下的特性

[[configurable]] 表示能否通過(guò)delete來(lái)刪除屬性從而定義新的屬性

[[enumerable]] 表示能否通過(guò)for in循環(huán)來(lái)遍歷返回屬性

[[get]] 在讀取屬性時(shí)候調(diào)用的函數(shù),默認(rèn)為undefined

[[set]] 在寫(xiě)入函數(shù)的時(shí)候調(diào)用的函數(shù),默認(rèn)的值為undefined

注意:訪問(wèn)器屬性不能直接定義,必須通過(guò)Object.defineProterty()定義

DEMO

 var book={
 _year:2015, //這里的下劃線是常見(jiàn)的記號(hào),表示只能通過(guò)對(duì)象的方法才能訪問(wèn)的屬性
 edition:1
}
Object.defineProperty(book,'year',{
 get:function(){
  return this._year; //即默認(rèn)通過(guò) book.year獲取值的時(shí)候 返回的是 boot._year的值
 },
 set: function (value) {//在對(duì) boot.year設(shè)置值的時(shí)候 默認(rèn)調(diào)用的方法 對(duì)數(shù)據(jù)進(jìn)行處理
  var _year=this._year;
  if(value > _year){
   this._year=value;
   this.edition+=value-_year;
  }
 }
})
book.year = 2016;
console.log(book.year,book.edition); // 2016 2

定義多個(gè)屬性

我們可以通過(guò)ES5中的Object.defineProperties()方法來(lái)給對(duì)象添加多個(gè)屬性,該方法接受兩個(gè) 對(duì)象 參數(shù),第一個(gè)參數(shù)是要添加和修改其屬性的對(duì)象,第二個(gè)對(duì)象的屬性和第一個(gè)對(duì)象中要添加和修改的屬性一一對(duì)應(yīng)。

DEMO

var book={};
Object.defineProperties(book,{
 _year:{
  value:2015,
  writable:true //注意這里設(shè)置成true 才可以 "寫(xiě)" 默認(rèn)是false 
 },
 edition:{
  value:1,
  writable:true //注意這里設(shè)置成true 才可以 "寫(xiě)" 默認(rèn)是false
 },
 year:{
  get:function(){
   return this._year;
  },
  set: function (value) {
   var _year=this._year;
   if(value > _year){
    this._year=value;
    this.edition+=value-_year;
   }
  }
 }
})
book.year=2016;
console.log(book.year,book.edition); // 2016 2

讀取對(duì)象屬性的特性

使用ES5中的Object.getOwnPropertyDescriptor()方法,可以去的給定的屬性的描述符。

該方法接收兩個(gè)參數(shù):屬性所在的對(duì)象和要讀取描述符的屬性名稱(chēng)。返回的是一個(gè)對(duì)象,如果是數(shù)據(jù)屬性,則返回的屬性有 configurable,enumerable,writable,value.如果是訪問(wèn)器屬性則返回的屬性有 configurable,enumerable,get,set

DEMO

var book={};
Object.defineProperties(book,{
 _year:{
  value:2015,
  writable:true
 },
 edition:{
  value:1,
  writable:true
 },
 year:{
  get:function(){
   return this._year;
  },
  set: function (value) {
   var _year=this._year;
   if(value > _year){
    this._year=value;
    this.edition+=value-_year;
   }
  }
 }
})
//對(duì)象遍歷函數(shù)
function showAllProperties(obj){
 for(var attr in obj){
  console.log(attr+':'+obj[attr]);
 }
}
var descriptor= Object.getOwnPropertyDescriptor(book,'_year');//數(shù)據(jù)屬性
var descriptor2= Object.getOwnPropertyDescriptor(book,'year');//訪問(wèn)器屬性
showAllProperties(descriptor);
console.log('============================');
showAllProperties(descriptor2);

以上關(guān)于初步了解javascript面向?qū)ο蟮娜績(jī)?nèi)容就介紹到這里,下面將給大家介紹深入淺析js面向?qū)ο笾斀獬R?jiàn)創(chuàng)建對(duì)象的幾種方式,感興趣的朋友繼續(xù)關(guān)注哦。

相關(guān)文章

最新評(píng)論