JavaScript對象、函數(你不知道的JavaScript)

來源:互聯網
上載者:User

標籤:javascript   js對象   js函數   你不知道的javascript   

一、對象
var obj = {};obj[true] = "foo";obj[3] = "bar";obj[obj] = "baz";obj["true"];obj["3"];obj["[object Object]"];
二、數組也是對象
var ary = ["foo", 42, "bar"];ary.baz = "baz";ary.length;//3ary.baz;/* 如果試圖想數組添加一個屬性,但是屬性名稱“看起來”像一個數字,那麼它會變成一個數值下標 */ary["4"] = "baz";ary.length;//5ary[4];
三、對象屬性writable:可寫(修改)
enumerable:可枚舉(for ... in)
configurable:可配置(配置、刪除)
注意:delete只能刪除對象(可刪除)屬性,即configurable為true的屬性。
var obj = {};Object.defineProperty(obj, "a", {enumerable:true, value:2});Object.defineProperty(obj, "b", {enumerable:false, value:3});/* 檢查給定屬性名稱是否直接存在於對象中(而不是在原型鏈上)並滿足enumerable:true */obj.propertyIsEnumerable("a");//trueobj.propertyIsEnumerable("b");//false/* 返回一個數組,包含所有(自身)可枚舉屬性 */Object.keys(obj);//["a"]/* 返回一個數組,包含所有(自身)屬性 */Object.getOwnPropertyNames(obj);//["a", "b"]
注意:in和hasOwnProperty(..)的區別在於是否尋找[[Prototype]]鏈,然而,Object.keys(..)和Object.getOwnPropertyNames(..)都只會尋找對象直接包含的屬性。
四、對象原型擷取對象原型:Object.getPropertyOf(..)
function Foo(){}var foo = new Foo();Foo.prototype === Object.getPrototypeOf(foo);//true
注意:在面向類的語言中,類可以複製(執行個體化)多次,就像用模具製作東西一樣。在JavaScript中,並沒有類似的複製機制。不能建立一個類的多個執行個體,只能建立多個對象,它們[[property]]關聯的是同一個對象。這樣就可用通過委託訪問對象的屬性和方法了。
類理論:在構造完成後,通常只需要操作這些執行個體(而不是類),因為每個執行個體都有你需要完成任務的所有行為。
五、原型鏈[[prototype]][[prototype]]機制就是存在於對象中的一個內部連結,它會引用其他對象。
var foo = {something:function(){// ....}};var bar = Object.create(foo);// 建立新對象bar,並將其關聯到對象foo上。
Object.create(null)會建立一個擁有空連結的對象,這個對象無法進行委託,其不存在原型鏈,所以instanceof總是返回false。其不受原型鏈幹擾,非常適合用來儲存資料!
對象之間的關係不是複製而是委託!!!
談及原型鏈不得不提及我們經常在JavaScript中的類型檢查!即內省:檢查執行個體的類型;主要目的是通過建立方式來判斷對象的結構和功能。
方式一:a instanceof Foo
方式二: “鴨子類型”:如果看起來像鴨子,叫起來像鴨子,那就一定是鴨子。
if(a.something) {a.something();// something()並不一定在a自身上}
方式三:isPrototypeOf()、getPrototypeOf()
建議使用方式三!!!
六、函數JavaScript中的函數無法(用標準、可靠的方法)真正地複製,所以只能共用函數對象的引用。這意味著,如果修改共用函數,比如增加一個屬性,所有引用地方都會隨之修改!
七、建構函式
function Foo(){}Foo.prototype = {};var a1 = new Foo();a1.constructor === Foo;//falsea1.constructor === Object;//true
詳解:
建立一個新對象並替換了函數預設的.prototype對象引用,那麼新對象並不會自動獲得.constructor屬性。
a1並沒有.constructor屬性,所以它會委託[[Prototype]]鏈上的Foo.prototype。但是這個對象也沒有.constructor屬性,所以它會繼續委託給鏈頂端的Object.protoype。
實際上,對象的.constructor會預設指向一個函數,這個函數可以通過對象的.prototype引用!
總之,constructor並不表示被構造!!!改變prototype並不能徹底改變繼承關係!!!
function Foo(name){this.name = "FenFei"}function Bar(){}

錯誤理解一:

Bar.prototype = Foo.prototype;Bar.prototype.myTest = 123;new Foo().myTest;//123
並不會建立一個關聯到Bar.prototype的新對象,它只是讓Bar.prototype直接引用Foo.prototype對象。當執行類似Bar.prototype.myTest = 123的賦值語句時會直接修改Foo.prototype對象本身。

錯誤理解二:

Bar.prototype = new Foo();new Bar("Camile").name;//FenFei
的確會建立一個關聯到Bar.prototype的新對象。但是它使用了Foo()的“建構函式調用”,如果Foo有副作用(比如註冊到其他對象、給this添加資料屬性等等),就會影響Bar()的後代。

正確處理方式一[ES6之前]:

Bar.prototype = Object.create(Foo.prototype);Bar.prototype.myTest = 123;new Foo().myTest;//undefinednew Bar("Camile").name;//undefined

正確處理方式二[ES6之後]:

Object.setPrototypeOf(Bar.prototype, Foo.prototype);Bar.prototype.myTest = 123;new Foo().myTest;//undefinednew Bar("Camile").name;//undefined
八、函數關係(1)在a的整條[[prototype]]鏈中是否有指向Foo.prototype的對象?
a instanceof Foo;
(2)在a的整條[[prototype]]鏈中是否出現過Foo.prototype?
Foo.prototype.isPrototypeOf(a);// 不需要間接引用函數Foo,它的prototype屬性會自動訪問。
(3)區別
isPrototypeOf()方法可以判斷對象間的關係。
b是否出現在c的[[prototype]]鏈中?
b.isPrototypeOf(c);
樣本:
function Foo(){}var a = new Foo();console.log(a instanceof Foo);// trueconsole.log(Foo.prototype.isPrototypeOf(a));// truevar b = {};var c = Object.create(b);console.log(b.isPrototypeOf(c));// trueconsole.log(b instanceof c);// TypeError

在傳統面向類的語言中,類定義之後就不會進行修改,所以類的設計模式不支援修改。但是JavaScript最強大的特性之一就是它的動態性,任何對象的定義都可以修改(除非你把它設定成不可變)!

[轉載請標明出處:http://blog.csdn.net/ligang2585116]

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。轉載請標明出處:http://blog.csdn.net/ligang2585116!

JavaScript對象、函數(你不知道的JavaScript)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.