Javascript高階程式設計學習筆記(二)

2021-08-01 06:44:42 字數 4459 閱讀 2772

屬性型別

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...