原型及原型鏈繼承之間的關係

2021-09-24 07:43:39 字數 2089 閱讀 9138

什麼是原型?

1.原型產生的原因

例項化其實是乙個很耗費記憶體空間的,通過建構函式去例項物件的時候,每乙個物件中的屬性和方法都是在自己的空間,那麼當有多個物件的時候,這些屬性和方法就有多少個在各自的空間中存在在,所以很浪費空間,因此,為了解決這個問題,實現資料共享,原型就產生了。

2.建構函式中有個prototype,是原型,也是我們平時所使用的

3.而我麼通過建構函式所例項化的物件中-proto-屬性,這也是原型,是瀏覽器使用的,這個下劃線原型指向的就是該例項物件中的建構函式中的prototype

4.如何訪問的到函式中的prototype呢?

例項物件.__proto__ 這樣就可以實現訪問prototype中的屬性和方法啦

複製**

function

person(name)

person.prototype.play = function()

var p1 = new person('cimei');

p1.play();

console.dir(person);//檢視建構函式的結構

console.dir(p1);//檢視例項物件的結構

console.log(p1.__proto__== person.prototype)//看他們的指向是否一致,此處結果是true

複製**

原型的指向問題

建構函式中的this就是例項物件(誰呼叫的就是誰的)

原型物件中的方法中的this就是例項物件

//person的建構函式

function

person(name)

//person的原型物件上的方法

person.prototype.play = function()

//subject的建構函式

function

subject(age)

//subject的原型物件上的方法

subject.prototype.eat = function()

//subject的原型,指向了person的例項物件

subject.prototype = new person('cimei');

var sub = new subject(18);

//此時發現可以呼叫person原型上的方法

sub.play();

//此時會報錯

sub.eat();

複製**

黑色線是真正的走向,紅色的線是被改變了的,已經不存在了。

總結:

例項物件的原型__proto__指向的是該物件的建構函式的原型物件

建構函式的原型物件prototype 指向如果改變了,那麼例項物件的原型__proto__指向自然也就會跟著改變

原型鏈其實例項物件與建構函式並沒有直接的關係,兩者之間的關係就通過例項物件中的那個__proto__和原型物件(prototype)來聯絡的。而我們也稱之為原型鏈

複製**

原型指向改變的話如何新增方法並訪問呢?

1.如上述例子,改變了subject的原型的指向,發現呼叫不了原來subject原型上的方法了

解決辦法:可以在原型改變之後 再新增在其原型上新增方法。

2.訪問屬性或方法

說白了,就是就近原則,例項物件有的話,就直接用,例項物件上沒有,就去原型物件上找。這裡有個問題,就是如果找不到也不會報錯,會返回乙個undefined,因為js是一門動態型別的語言,物件沒有的話,只要有點(.),那麼這個物件就有了這個東西,沒有我們要的這個東西,只要有物件.屬性這個名字,物件就有了這個屬性,但是還沒有給其賦值,所以是undefined的。總結就是js有立即創造屬性的能力,大方的很,你沒有,我就給你乙個。

封裝:其實就是把一些相似的物件放在js檔案按中

繼承:js中的繼承是通過建構函式去模擬類,然後通過原型來實現的。其中原型實現了資料的共享,為我們節約了記憶體空間。

那麼原型的作用也就有了兩個:一是節約了記憶體空間,二是實現了繼承

多型:乙個物件有不同的行為,或者是乙個行為針對不同的物件,產生不同的結果,要想實現多型,就要先有繼承

原型 原型鏈 繼承

原型 是function物件的乙個屬性,它定義了建構函式 製造出的物件 的公共祖先。通過該建構函式產生的物件,可以繼承該原型的屬性和方法。原型也是物件 這定義有點模糊,用 解釋一下 我們在控制台中列印出了這個,首先son物件的建構函式是foo,但是我們的foo中什麼屬性都沒有,怎麼會出現乙個 pro...

原型 原型鏈 繼承

在 js 中,一切皆物件!下面就讓我們從建立物件開始,逐步學習js中的核心知識 原型,原型鏈,繼承等 1.字面量方式建立物件 var obj var obj1 2.使用 new object 的方式建立物件 var obj2 new object obj2.name 張三 obj2.age 13 o...

建構函式 原型物件 原型鏈之間的關係

一 三者的概念 在js中萬物都是物件,每個資料中都有一條屬性叫 proto 這個屬性叫隱式原型,乙個物件中的隱式原型指向構造該物件的建構函式的原型物件prototype。prototype 是原型物件,專屬於函式,作用 為將來創造例項做父級使用,減少記憶體。constructor 指向了當前所在的p...