建立物件的4種方式
var obj = ;
物件字面量是乙個名/值對列表,每個名/值對之間用逗號分隔,名和值之間用冒號分隔,最後整體用乙個花括號括起來。
屬性名可以使用數值,比如5。數值屬性名會自動轉換為字串。
var person = ;
屬性名一般不加引號,以下情況必須加引號:
在es5(以及es3的一些實現)中,保留字可以用做不帶引號的屬性名。然而對於es3來說,使用保留字作為屬性名必須使用引號引起來。
例子:
var person = ;
在es5中,物件直接量中的最後乙個屬性後的逗號可以省略,且在es3的大部分實現中也可以忽略這個逗號,但在ie中則報錯。
使用物件字面量語法時,如果留空其花括號,則可以定義只包含預設屬性和方法的空物件。
var obj = {};
物件字面量也可以先建立,再新增屬性和方法。
var person = {}; //與new object()相同person.name = "nicholas";person.age = 29;
在通過物件字面量定義物件時,實際上不會呼叫object建構函式。
物件可以巢狀物件:
例如:
var myhome=, say : function() }
或
//構造巢狀的物件var schooldata = ;//構造被嵌入的物件var zgkjdx = ;
有乙個缺點:如果我們想在其他地方建立乙個同樣的物件,就得把這個物件的所有**都複製貼上過去。我們需要一種能夠批量建立同樣物件的方法,而不是只建立乙個物件。
有乙個問題:即無法保證屬性的順序。
新增屬性的順序可能並不是遍歷輸出屬性時的順序。
例如
var o = {}o.a = 1o.b = 2o.c = 3for(key in o) console.log(key); // expected a,b,c - but not guaranteed to be in that order
object 物件也缺乏foreach的方法,不能對object使用通常的迭代方法。
o.foreach // undefined
var obj = new object();
這裡的函式稱做建構函式(constructor)。
如下所示:
var person = new object();person.name = "nicholas";person.age = 29
如果建構函式無引數,括號則不是必需的。
因此可以採用下面的形式重寫上面的兩行**:
var oobject = new object;var ostringobject = new string;
var str = new string();console.log(str); // 輸出的是 stringconsole.log(typeof str);//object;
js原始型別都包含內建建構函式。例如:
var o = new object(); // 建立乙個空物件,和{}一樣var a = new array(); // 建立乙個空陣列,和一樣var d = new date(); // 建立乙個表示當前時間的date物件var r = new regexp("js"); //建立乙個可以進行模式匹配的eegexp物件
在js中,通過 new 運算子來作用與乙個函式,實質上會發生這樣的過程:
function a(o)let obj = new a();
例子:
function person(firstname,lastname,age,eyecolor)var myfather=new person("bill","gates",56,"blue");var mymother=new person("steve","jobs",48,"green");
在自定義建構函式的內部定義物件的方法:
function person(firstname,lastname,age,eyecolor)}
changename() 函式 name 的值賦給 person 的 lastname 屬性。
mymother.changename("ballmer");
object.create()是乙個靜態函式,而不是提供給某個物件例項呼叫的方法。
var o1 = object.create(); // o1繼承了屬性x和y
可以通過任意原型建立新物件(換句話說,可以繼承任意物件)。
第乙個引數是這個新物件的原型。
第二個引數屬性描述符物件propertiesobject,用於對物件的屬性進行進一步描述。可選。
屬性描述符物件中的屬性,預設不可列舉,是繼承的屬性。
如果propertiesobject指定為 undefined,那麼是空物件{}。如果是null或非原始包裝物件,則丟擲乙個 typeerror 異常。
o = object.create(object.prototype, , // bar會成為所建立物件的訪問器屬性 bar: , set: function(value) }});
返回乙個新物件,帶著指定的原型物件和屬性。
例子:
var obj = object.create({}, });object.values(obj); // =>
上面**中,object.create()方法的第二個引數新增的物件屬性(屬性p),如果不顯式宣告,預設是不可遍歷的,因為p是繼承的屬性,而不是物件自身的屬性。
可以通過傳入引數null來建立乙個沒有原型的新物件,但通過這種方式建立的物件不會繼承任何東西,甚至不包括基礎方法,比如tostring(),也就是說,它將不能和「+」運算子一起正常工作:
var o2 = object.create(null); //o2不繼承任何屬性和方法
如果想建立乙個普通的空物件(比如通過{}或new object()建立的物件),需要傳入object.prototype:
var o3 = object.create(object.prototype); //o3和{}和new object()一樣
例子:通過原型繼承建立乙個新物件。
inherit() 返回了乙個繼承自原型物件p的新物件。
這裡使用es5中的object.create()函式(如果存在的話)。
如果不存在object.create(),則退化使用其他方法。
function inherit(p) ; // 定義乙個空建構函式 f.prototype = p; //將其原型屬性設定為p return new f(); //使用f()建立p的繼承物件}var o = {}; o.x = 1; var p = inherit(o); // p繼承o和object.prototypep.y = 2; var q = inherit(p); q.z = 3; var s = q.tostring(); q.x + q.y // => 3: x和y分別繼承自o和p
注意,inherit()並不能完全代替object.create(),它不能通過傳入null原型來建立物件,而且不能接收可選的第二個引數。
inherit()函式的其中乙個用途就是防止庫函式無意間(非惡意地)修改那些不受你控制的物件。
不是將物件直接作為引數傳入函式,而是將它的繼承物件傳入函式。
當函式讀取繼承物件的屬性時,實際上讀取的是繼承來的值。
如果給繼承物件的屬性賦值,則這些屬性只會影響這個繼承物件自身,而不是原始物件:
var o = ;library_function(inherit(o)); // 防止對o的意外修改
js物件屬性
function createdocument if typeof arguments.callee.activexstring string var versions msxml2.domdocument.6.0 msxml2.domdocument.3.0 msxml2.domdocument ...
js 中物件屬性的特性
資料屬性 資料屬性包含乙個資料值的位置,在這個位置可以讀取和寫入值。4個描述的行為特性 writable 表示能否修改屬性的值。預設為true enumerable 表示能否過過for in迴圈返回屬性是否可以列舉。configuralbe 表示是否能過來delete刪除屬性從來重新定義屬性,能否修...
js中物件屬性的整理
都知道js是物件導向的,建立了物件後,物件中儲存的就是一組組名值對,值可以是資料型別或函式。不管函式還是資料,都可以稱為某某物件的屬性。再細分,屬性可以有兩個型別 資料屬性或訪問器屬性。因此,資料屬性不要誤解為是資料的屬性型別,函式的屬性型別也是資料屬性的。var obj age 11 consol...