JS原型物件,原型鏈

2021-08-10 21:10:36 字數 2439 閱讀 3409

js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor

var obj = new

object();

var arr = new

array();

var obj2 = {}; //字面量建立實質上是上面方式的簡寫

var arr2 = ;

var str = new

string("test"); //建立的是物件

var str2 = "test"; //建立的是基本型別值

console.log(typeof str); //object

console.log(typeof str2); //string

為了減少重複定義相似的物件,我們把這些相似的資料結構(屬性)和行為(方法)抽象出來形成類,這樣我們只需要建立類,然後將類例項化即可。所有物件例項繼承了類的屬性和方法。

在es5中沒有class關鍵字來建立類,它是通過建構函式和原型物件來模擬類的功能。

原型物件可以使物件例項繼承它的屬性和方法。要想實現這個繼承關係,必須讓原型物件和物件例項發生聯絡。

我們知道物件例項是通過建構函式建立的。那這個建構函式能不能先建立物件原型,然後這個建構函式再建立物件例項,這樣物件例項就通過建構函式這個紐帶和物件原型發生了聯絡。

答案是可以,

js的每個函式都有乙個prototype屬性,這個屬性是乙個指標,指向的是它的原型物件。我們通過建構函式來建立乙個物件。

function

test

()test.prototype.name = "testproto"; //建立建構函式的原型物件的屬性

test.prototype.age = 21;

var obj = new test(); //建立例項物件

console.log(obj);

console.log(test.prototype);

console.log(obj.name); //訪問到了原型物件上的name

obj是test函式的物件例項,test.prototype物件是test函式的原型物件(我們給這個原型物件新增了name和age屬性)。這兩個物件是如何發生聯絡的?

開啟瀏覽器除錯工具

可以看到obj物件有乙個_ proto_屬性,這個屬性就是指向其建構函式的原型物件。

注意:物件例項只和其建構函式的原型物件有聯絡,它繼承的是原型物件的屬性和方法,而不是建構函式的屬性和方法。為什麼物件不能繼承object的方法?

// 我們可以列印常見的物件的方法,這些方法都是在建構函式的原型中定義的。

console.log(number.prototype);

console.log(string.prototype);

console.log(boolean.prototype);

console.log(array.prototype);

console.log(object.prototype);

每個物件中都有乙個[[prototype]]屬性指向其建構函式的原型物件(一般在瀏覽器中是_ proto _屬性)

現在有兩個物件obj1,obj2。要實現obj2繼承obj1。

很簡單,只要讓 obj2._ proto _=obj1

這樣就形成了一條原型鏈,

在訪問obj2物件的屬性時,會現在obj2物件中尋找,若找到則停止尋找,返回其屬性。否則會在原型鏈上向後尋找。

比如在訪問obj的name屬性時,會在obj中找到,所以返回了」obj」,它不會再去找原型鏈上後面的name屬性了;若訪問obj的age屬性時,在obj中沒有找到,它就會去原型鏈上尋找。

for in返回物件和原型鏈上可列舉的屬性,object提供了一種方法來訪問物件本身的屬性object.getownpropertynames(),此方法不會包括原型鏈上的屬性。

//所有物件都是繼承object物件的

console.log(number.prototype.__proto__===object.prototype); //true

console.log(string.prototype.__proto__===object.prototype); //true

console.log(array.prototype.__proto__===object.prototype); //true

JS 物件 JS原型 原型鏈

參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...

js原型物件 原型鏈 繼承

原型物件 只要建立了乙個新函式,就會根據一些特定的規則為該函式建立乙個prototype屬性,這個屬性指向的物件就是該新函式的原型物件。預設情況下,所有原型物件都會自動獲取乙個constructor屬性,這個屬性是乙個指向prototype屬性所在函式的指標 原型物件的優點 可以讓所有物件例項共享它...

js原型物件和原型鏈的理解

原型的存在主要是為了解決在例項化時,節省記憶體,可以減少例項化是物件內部的屬性或者方法過多,可以將這些屬性或者方法放在原型上,例項物件在需要這些屬性或者方法時,可以直接呼叫,js會根據原型鏈進行查詢。function protof name,age protof.prototype.showtest...