什麼是原型?
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...