js原型鏈和繼承

2022-06-28 14:06:10 字數 1852 閱讀 8692

在了解js原型鏈之前建構函式、原型物件、物件例項這幾種概念必須要明白。

1. 建立物件有幾種方法

//原型鏈指向object

var o1=;

var o11=new object();//通過new來宣告物件

var m=function() //使用顯示的建構函式建立物件

var o2=new m();

var p=;

var o3=object.create(p)

每個物件都有乙個__proto__屬性,指向這個物件的建構函式的原型物件。

2. 建構函式和普通函式的區別

(1)建構函式內部會建立乙個新的物件例項;函式內部this指向新建立的例項;預設的返回值是f的例項。

(2)在呼叫函式的內部不會建立新的物件;this指向函式呼叫的物件,如果沒有物件呼叫,預設是window;返回值由return語句決定。

3. 原型物件

在宣告乙個函式的時候就會有prototype屬性,就是原型物件,原型物件內部包含乙個constructor屬性,指向建構函式本身。

4. 建構函式、原型和例項的關係

每個建構函式都有乙個原型物件(prototype),原型物件都包含乙個指向建構函式的指標(constructor),而例項都包含乙個指向原型物件的內部指標(__proto__)。

建構函式----prototype原型物件-----__proto__---原型物件。

5. 原型鏈

當呼叫某種方法或者查詢某種屬性時,首先會在自身查詢和呼叫,如果自身沒有該屬性或方法時,則會去他的__proto__屬性中去查詢,也就是去他的建構函式的原型物件中去查詢。

如果我們讓原型物件等於另乙個型別的例項,此時的原型物件將包含乙個指向另乙個原型的指標,此關係層層遞進,構成例項與原型的鏈條。例子:

function

type()

type.proptotype.getvalue = function

()function

subtype()

//繼承了type

subtype.prototype = new

type();

subtype.prototype.getsubvalue = function

()var result = new

subtype();

alert(result.getvalue())

//true

以上**分別定義兩個型別,每個型別分別有乙個屬性和方法。它們的主要區別是subtype繼承了type,而繼承是通過建立type的例項,並將改例項賦給subtype.prototype實現的。實現的本質是重寫原型物件,代之以乙個新的型別的例項。

也就是原來存在於type例項中所有的屬性和方法都被subtype繼承。

最終,result指向subtype的原型,而subtype的原型又指向type的原型。

6. 繼承

原型鏈是實現繼承的主要方法,基本思想是利用原型讓乙個引用型別繼承另乙個引用型別的屬性和方法。

最後,兩個相等

function fn(){}

var f = new fn()

例項的隱式原型(__proto__)指向它的建構函式的顯示原型(prototype)即 f.__proto__=== fn.prototype // true

建構函式的原型裡有乙個constructor屬性指向建構函式本身 即 fn.prototype.constructor === fn //true

js繼承,原型鏈繼承

1 乙個型別的物件能夠訪問另外乙個型別的屬性和方法 2 類與類之間的關係 類就是眾多例項共有的屬性和方法的乙個抽象 function animal name animal.prototype.say function function dog 把子類的原型指向父類的例項 dog.prototype ...

js 原型鏈繼承

建構函式的prototype的 proto 預設指向object.prototype,是繼承object。function animal age animal.prototype.getage function animal.prototype.eat function function dog n...

js原型鏈繼承

function foo var foo newfoo console.log foo.proto foo.prototype true console.log foo.proto foo.constructor.prototype ture function foo var foo newfoo ...