屬性型別
1,資料屬性
var person = ]
[[configurable]]
表示能否通過
delete
刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。如上直接在物件上定義的屬性,預設為
true。
[[enumerable]]
表示能否通過
for-in
迴圈返回屬性。如上直接在物件上定義的屬性,預設為
true。
[[writable]]
表示能否修改屬性的值。如上直接在物件上定義的屬性,預設為
true。
[[value]]
包含這個屬性的資料值。預設為
undefined。
用object.defineproperty()
方法時,如果不指定,
configurable,enumerable,writable
特性的預設值都是
false。
例如:
var person = ;
[[value]]
特性將被設定為
"nicholas"
要修改屬性預設的特性,必須使用
es5的
object.defineproperty()
方法。這個方法接收三個引數:屬性所在的物件、屬性的名字和乙個描述符物件。其中,描述符物件的屬性必須是:
configurable
、enumerable
、writable
和value
。設定其中乙個或多個值,可以修改對應的特性值。
var person = {};
object.defineproperty(person,"name",);
alert(person.name); //nicholas
person.name = "greg";
alert(person.name); // nicholas
2,訪問器屬性
訪問器屬性不包含資料值;它們包含一對
getter
和setter
函式。
訪問器屬性也有四個特性:
[[configurable]]表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。預設為true。
[[enumerable]]表示能否通過for-in迴圈返回屬性。預設為true。
[[get]]讀取屬性時呼叫的函式。
[[set]]
寫入屬性時呼叫的函式。
訪問器屬性不能直接定義,必須使用
object.defineproperty()
來定義。
var book = ;
object.defineproperty(book,"year",,
set : function(newvalue) }
});book.year = 2005;
alert(book.edition); //2
_year
前面的下劃線是一種常用記號,用於表示只能通過物件方法訪問的屬性。訪問器屬性
year
則包含乙個
getter
函式和乙個
setter
函式。getter
函式返回
_year
的值,setter
函式通過計算來確定正確的版本。因此,把
year
屬性修改為
2005
會導致_year
變成2005.
這是訪問器屬性的常見方式,即設定乙個屬性的值會導致其他屬性發生變化。
不一定非要同時指定
getter
和setter
。只指定
getter
意味著屬性不能寫。
上面方法之前使用
__definegetter__() & __definesetter__()
來建立getter
和setter。
object.defineproperties()
方法可以通過描述符一次定義多個屬性。接收兩個物件引數:第乙個物件是要新增和修改其屬性的物件,第二個物件的屬性與第乙個物件中要新增或修改的屬性一一對應。例如:
var book = {};
object.defineproperties(book,,
edition : ,
year : ,
set : function(newvalue) }
} });
3,讀取屬性的特性
object.getownpropertydescriptor()
可以取得給定屬性的描述符。接收兩個引數:屬性所在的物件和要讀取其描述符的屬性名稱。返回值是乙個物件。
如果是訪問器屬性,這個物件的屬性有
configurable,enumerable,get,set
;如果是資料屬性,這個物件的屬性有
configurable,enumerable,writable,value。
var descriptor = object.getownpropertydescriptor(book,"_year");
alert(descriptor.value); //2004
alert(descriptor.configurable);//false js
中,可以針對任何物件
---包括
dom和
bom物件使用
object.getownpropertydescriptor()
方法。 4
,建構函式模式
function person(name,age,job); }
var person1 = new person("nicholas",29,"se");
內部流程: 1
,建立乙個新物件; 2
,將建構函式的作用域賦給新物件,;(
this
就指向了這個新物件) 3
,執行建構函式中的**;(為新物件新增屬性) 4
,返回新物件;
特點:沒有顯式的建立物件;
直接將屬性和方法賦給了
this
物件;
沒有return;
person1.constructor == person~
以這種方式定義的建構函式是定義在
global
物件中的。
建構函式與其他函式的唯一區別,就在於呼叫它們的方式不同。建構函式也是函式,不存在定義建構函式的特殊語法。任何函式,只要通過
new操作符來呼叫,那它就可以作為建構函式。如果不通過
new來呼叫,跟普通函式沒區別。
5,原型模式
我們建立的每乙個函式都有乙個prototype
屬性,這個屬性是乙個指標,指向乙個物件。這個物件的用途是包含可以由特定型別的所有例項共享的屬性和方法。
例子:function person(){}
person.prototype.name = "nicholas";
person.prototype.age = 29;
person.prototype.job = "se";
person.prototype.sayname = function()
var person1 = new person();
person1.sayname(); // "nicholas"
var person2 = new person();
person2.sayname(); //"nicholas"
alert(person1.sayname == person2.sayname);//true
理解原型物件
只要建立了乙個函式,就會根據一組特定的規則為該函式建立乙個
prototype
屬性,這個屬性指向函式的原型物件。在預設情況下,所有原型物件都會自動獲得乙個
constructor
(建構函式)屬性,這個屬性包含乙個指向
prototype
屬性所在函式的指標。如:
person.prototype.constructor ->person
[[prototype]] :
person1
、person2
與建構函式沒有直接關係,而是通過例項的內部屬性
[[prototype]]
(指向person.prototype
)聯絡的。
alert(person.prototype.isprototypeof(person1));//true
object.getprototypeof(person1) == person.prototype;
to be continue~~~~~~
JavaScript高階程式設計
ecmascript有5種基本型別資料 另外還有一種複雜的資料型別 typeof就是用來檢測變數的資料型別的,typeof可能會返回以下值 typeof操作符在檢測引用型別的值時,總是會返回object,所以用處不大。instanceof用來檢測物件型別的,返回值是 true false。例如 pe...
JavaScript高階程式設計 this
在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了 因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。所謂建構函式就是用來new物件的函式。其實嚴格來說,所有的函式都可以new乙個物件,但是有些函式的定義是為了new乙個物件...
javascript 高階程式設計 二
這裡我們直接進入主題 在js剛剛開始的時候,必須面臨乙個問題,那就是如何使的js的載入和執行不會影響web核心語言html的展示效果,和html和諧共存。在這個背景下 2 xhtml中的應用 在html中如果字串,那麼html就會認為js指令碼已經結束所以會產生乙個錯誤用一下 來替換 來替換aler...