js中類的所有例項物件都從同乙個原型物件上繼承屬性。我們可以自己寫乙個物件建立的工廠方法來來「模擬」這種繼承行為:
//inherit()返回乙個繼承自原型物件p的屬性的性物件
//這裡使用ecmascript5中的object.create()函式
//如果不存在該函式,則使用另一種方法
function
inherit
(p);
f.prototype = p;
return
new f();
}
**中object.create方法是在ecmascript5中定義的,它建立乙個新的物件,其中第乙個引數是這個物件的原型:
var x = object.create();
var y = object.create(object.prototype);//和{}或new object()類似
下面模擬了乙個類的建構函式:
function
range
(from,to)
range.methods = ,
foreach:function
(f),
tostring:function()}
//我們可以向下面這樣建立range物件以及呼叫它的方法
var r = range(1,3);
r.includes(2);
r.foreach(console.log);
console.log(r);
接下來我們用js的標準的new方法來建立相同的物件:
//類的建構函式約定首字母大寫
//注意函式結尾不用return something**
function range(from,to)
//方法內容和前面一樣,省略
range.prototype = ,
foreach:function(f),
tostring:function()
};//同樣給出建立和使用的**
var r = new range(1,3);
r.includes(2);
r.foreach(console.log);
console.log(r);
以上**遵循了乙個程式設計約定:定義建構函式即是定義類,首字母需要大寫,普通函式和方法的首字母皆為小寫。
還有要注意的是,第一段**原型是range.methods,這種命名可以是任意的;而第二段**中原型是range.prototype,這個名稱是必須的。對range()建構函式的呼叫會自動使用range.prototype作為新range物件的原型。
每個js函式(ecmascript5中的function.bind()方法返回的函式除外)都自動擁有乙個prototype屬性,該屬性的值為乙個物件,該物件包含唯一乙個不可列舉屬性constructor,該屬性的值味乙個函式物件:
var f = function
(){};
var p = f.prototype;
var c = p.constructor;
c === f //must true!對於任意函式f,有f.prototype.constructor === f;
以上可以認為constructor是以指回其建構函式的反向」指標」,由於constructor方法在物件的原型物件中,所以可以用任意物件來呼叫:
var obj = new f();
obj.constructor === f; //must true!
需要注意的是,以上第2個例子中range類使用了乙個新的物件重寫了預定義的range.prototype物件,但是這個新定義的原型物件不含有constructor屬性,因此range類的例項中也不含有constructor屬性,我們可以給原型顯示新增乙個建構函式:
range.prototype =;
還有一種方法是使用預定義的原型物件,域定義的原型物件包含constructor屬性:
range.prototype.includes = function(x);
range.prototype.foreach = function(f);
range.prototype.tostring = function();
JavaScript中原型和原型鏈
原型 prototype 為其他物件提供共享屬性的物件。每個函式都有乙個原型 prototype 屬性,這個屬性是乙個指標,指向乙個物件,這個物件包含特定例項共享的一些屬性和方法。以例服人 這個例子說明了原型物件是共享的,並且是乙個指標,並且物件的例項中也有指向prototype指向物件的指標。fu...
深入javascript之原型和原型鏈
所有引用型別 函式,陣列,物件 都擁有 proto 屬性 隱式原型 所有函式擁有prototype屬性 顯式原型 僅限函式 原型物件 擁有prototype屬性的物件,在定義數時就被建立 先複習下建構函式 建立建構函式 function word words word.prototype 建立例項 ...
深入JavaScript之原型和原型鏈
所有引用型別 函式 陣列 物件 都擁有 proto 屬性 隱式原型 所有函式擁有prototype屬性 顯式原型 僅限函式 原型物件 擁有prototype屬性的物件,在定義函式時就被建立 建立建構函式 function word words word.prototype 建立例項 var w ne...