js面向對象程序設計之屬性和對象


寫在博客之前的話,這是我這個剛畢業的菜鳥的第一篇博客。一口吃不成一個胖子,我也希望寫的第一篇東西就讓讀的人醍醐灌頂。我會抱着懷疑的態度來看自己寫的文章,如果有寫錯的地方,請大家不要被誤導,如果有大神提出意見,我會驗證之后進行修改。

js中對象

對象是某個特定的引用類型的實例。創建的對象的方法有兩種,使用new操作符后跟Object的構造函數,還有一種是使用對象字面量。

1,這是通過new操作符然后直接給屬性賦值的方法創建對象

var person=new object();
person.name
="shaoqi";
perosn.age
=18;
person.job
='IT'

person.sayName
=function(){
alert(
this.name)
}

2,對象字面創建對象

var person={
name:
"shaoqi",
age:
18,
job:
"IT",

sayName
:function(){
alert(
this.name);
}
}

js中對象的屬性

js中的屬性分兩種,數據屬性和訪問器屬性。兩者就像c#中的字段和屬性(這是我認為的)。屬性在創建的是都帶有一些特征值,javaScript通控制特征來定義它們的行為。

1,數據屬性。

屬性屬性有以下幾個特性:

[[Configuarable]]:表示能否通過delte刪除該屬性,或者將屬性修改文訪問器屬性

[[Enumerable]]:是否可以通過for-in循環返回屬性。

[[Writeable]]:是否能修改屬性的值,默認為true。

[[Value]]:屬性的值,默認為undefined。

我們可以用Object.defineProperty()這個方法修改屬性的特性。可以用下面的代碼實現上面的特性。

Configurable:

var person={
}

Object.defineProperty(person,
"name",{
configurable:
false,
value:
"shaoqi"
})

alert(person.name);
delete person.name;
alert(person.name);
你會發現name的值並沒有被刪除,也就是說Configurable設置為false是不能將該屬性刪除的。需要注意的是在非嚴格模式下這種做法是不會引發錯誤的,但在嚴格模式下是會發生錯誤的。

Writeable:

var person={
}

Object.defineProperty(person,
"name",{
writable:
false,
value:
"shaoqi"
})

alert(person.name);
person.name
="ddddd"
alert(person.name);
name的值也是不會變的。

Enumerable:

var person={
}

Object.defineProperty(person,
"name",{
writable:
false,
enumerable:
false,
value:
"shaoqi"
})
var keys=Object.keys(person);
console.log(keys);
可以修改Enumerable的值來看最后log打出印出來的結果。

2,訪問器屬性

訪問器屬性也有幾個特性

[[Configurable]]:表示能否通過delte刪除該屬性,或者將屬性修改文訪問器屬性

[[Enumerable]]:是否可以通過for-in循環返回屬性。

[[Get]]:在讀取屬性時調用的函數。默認為undefined

[[Set]]:在寫入屬性時調用的函數。默認為undefined

Configurable和Enumerable和數據屬性相同。下面重點介紹Get和Set的屬性。

訪問器屬性不能直接定義的,也必須使用Object.defineProperty()來定義。

var book={
_year:
2004,
edition:
1
}

Object.defineProperty(book,
"year",{
get:
function()
{
return this._year;
},
set:
function(newValue){
if(newValue>2004)
{
this._year=newValue;
this.edition+=newValue-2004;
}
}
})

book.year
=2006;
console.log(book.edition);

結果應該是三,在賦值的時候,調用了我們寫的set函數。這個C#中的字段和屬性的關系十分的相似。

3,如何獲取屬性的特性

在ECMAScript5中的Object.getOwnPropertyDescriptor()的方法,可以取得給定屬性的描述符。可以通過他給出的屬性來判斷是數據屬性還是訪問器屬性。

var book={
_year:
2004,
edition:
1
}

Object.defineProperty(book,
"year",{

get:
function()
{
return this._year;
},
set:
function(newValue){
if(newValue>2004)
{
this._year=newValue;
this.edition+=newValue-2004;
}
}
})

book.year
=2006;
console.log(book.edition);


var descript=Object.getOwnPropertyDescriptor(book,"year");
console.log(descript.value);
console.log(descript.configurable);
console.log(descript.enumerable);
console.log(descript.get);

對於訪問器的value是為undefined的,其他應該沒有什么問題。get的方法也都打在日記里面了。

js的屬性就先講到這里,雖然對應用方面不太重要。但對js的對象理解還是比較起作用的。下一篇准備開始寫創建對象的模式,繼承的模式,原型鏈的解釋。希望自己能形成自己的知識體系。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com