對象是js中的一種基本的數據類型,除了可以給自身附屬性外,javascript對象還可以從一個稱為原型的對象繼承屬性。這種“原型式繼承”是javascript的核心特征。 在javascript中,創建一個對象通常可以有三個方法,對象直接量,關鍵字new和Object.create()函數。接下來會 ...
對象是js中的一種基本的數據類型,除了可以給自身附屬性外,javascript對象還可以從一個稱為原型的對象繼承屬性。這種“原型式繼承”是javascript的核心特征。
在javascript中,創建一個對象通常可以有三個方法,對象直接量,關鍵字new和Object.create()函數。接下來會對這些技術稍作講述,然後引出原型及構造函數。
一:對象直接量
對象直接量是一個表達式,這個表達式的每次運算都創建並初始化一個新的對象。下麵有一些例子:
var o = {}; //這個方法和var o =new Object();一樣。
var object = {'x':1,'y':2};
var word = {'word':'hello',"sayHello":function(){}};
二:通過new創建對象
new運算符創建並初始化一個對象,往往後面跟著一個構造函數的調用,就像這樣:
var o = new Object(); //創建一個空對象 跟{}一樣
var a = new Array();
var d = new Date();
除了一些內置的構造函數以外,也可以自定義構造函數用來初始化新對象。
function A(){ //構建的構造函數一樣要求首字母大寫的習慣
};
var a = new A();
三. Object.create()
ECMAScript5定義了一個名為Object.create()的方法,它創建了一個新對象,其中第一個參數是這個對象的原型。諸如:
var o = Object.create({'x':1,'y':2}); //o繼承了屬性x,y
var o2 = Object.create(Object.prototype); //這種方法和{}及new Object()一樣
但是這個有個特殊的存在,var o1 = Object.create(null); //o1將不繼承任何屬性,null不存在任何原型對象。
進入正題
OK,到現在介紹完了對象的創建,我們再簡單解釋下原型。每一個javascript對象(null除外)都和另一個對象相關聯,“另一個”對象就是我們熟知的原型,每一個對象都從原型繼承屬性。
所有通過對象直接量創建的對象都具有同一個原型對象(Object.prototype)。通過關鍵字new和構造函數調用創建的對象的原型就是構造函數的prototype屬性的值。就好像通過new Array ( )創建的對象的原型就是Array.prototype , 通過new Function()創建的對象的原型就是Function.prototype。通過Object.create(xx)創建的對象的原型就是其傳進去的參數。
沒有原型的對象不多,null及Object.prototype都是,他們不繼承屬性。其他的原型對象都是普通對象,普通對象都具有原型。所有的構造函數都具有一個繼承自Object.prototype的原型。舉個例子,var f = new Function(); f對象的屬性繼承了Function.prototype,而Function.prototype又繼承了Object.prototype,這一系列鏈接的原型對象就是所謂的“原型鏈”(prototype chain)。一個對象的__proto__ 屬性和自己的內部屬性[[Prototype]]指向一個相同的值 (通常稱這個值為原型),原型的值可以是一個對象值也可以是null(比如說Object.prototype.__proto__的值就是null).
舉個例子:
s是String構造的實例,它指向String的原型(String.prototype),String的原型指向Object.prototype,Object.prototype的原型指向null。
接下來談談構造函數
儘管構造函數不像原型那樣基礎,但構造函數是類的“外在表現”。構造函數的名字通常用作類名。常見的內置構造函數有Object,Array,String,Function,Number等,任何js的函數都可以用來作為構造函數,並且調用構造函數是需要用到一個prototype屬性的。這個屬性是一個對象,這個對象包含唯一一個不可枚舉屬性constructor,constructor屬性的值是一個函數。
而且,例子中可以看到構造函數的原型中的constructor屬性等於這個構造函數本身,這也就意味著對象通常繼承的constructor均指代它們的構造函數。
接下來會有一個問題。
Function,String構造函數均是對象,它們的原型指向都是對象原型,所以它們都是Object的實例,那麼,String,Function這些構造函數和Function有什麼關係呢?Object instanceof Function的結果是什麼呢?
事實證明:
解釋如下:
javascript里一切都可以當作對象來看待,構造函數本身也是對象,它們都是由Function實例化來的,它們(指的String等本身,而不是它們的原型對象)的原型指向Function.prototype.所以,它們也都是Function的實例對象。
本文實屬個人理解js的原型部分,如果有什麼錯誤的地方,歡迎指出,拍磚~
歡迎關註我的訂閱號,每周均有本人嘔心瀝血之作,請多多交流,請教~~~純屬技術交流,廣告黨就免啦~~謝絕不走。。