面試中經常考到面向對象的一些知識,在這記錄一下,如有不對歡迎指正,願在前端的道路上共勉! 一、原型 1.什麼是原型: 簡單說就像css的class一樣,是公用的,給DOM元素加個class名就可以公用樣式,那麼原型就相當於css裡面的class,都可以用。 在構造函數創建出來的時候,系統會預設的幫構 ...
面試中經常考到面向對象的一些知識,在這記錄一下,如有不對歡迎指正,願在前端的道路上共勉!
一、原型
1.什麼是原型: 簡單說就像css的class一樣,是公用的,給DOM元素加個class名就可以公用樣式,那麼原型就相當於css裡面的class,都可以用。
在構造函數創建出來的時候,系統會預設的幫構造函數創建並關聯一個神秘的對象,這個對象就是原型,構造函數的每一個實例都可以訪問原型中的成員(一般我們放方法);
2.原型鏈:(原型鏈這個概念常考哦~) 首先呢,正如上面所說的,當函數被new操作符調用時,會創建出一個對象,並且該對象中會有一個指向其原型對象的秘密鏈接(一個非標準屬性:_proto_),這樣新建的對象(實例)就可以調用相關原型對象中的成員;(咳咳,正題來了哈)但是,原型對象自身也具有對象固有的普遍特征(它也是個對象),因此,也包含了指向其原型對象的鏈接,因此嘞,就形成了一個鏈式結構,稱之為原型鏈;
請原諒我畫畫的技術:
二、繼承
1.那麼什麼又是繼承呢:其實就是一個對象沒有的成員,但是另一個對象有,給它拿過用;(在現實世界中這好像叫‘借’吧)
2.繼承的過程:(這裡引用blue老師的一個比喻) 你媳婦他媽跟你要100萬,你沒有咋辦?找你爹,你爹也沒有,咋整?找你爹的爹,但是你爹的爹的爹死了,所以你爺爺說家裡沒有,也就是返回null;(其實寫到這裡我內心是崩潰的)
3.繼承方式:
1 //1.混入式繼承,說是混入式有點高大上,其實就是遍歷賦值 2 function Person(){ 3 4 } 5 6 let obj = { 7 name:'jack', 8 age:'18', 9 sayHello:function(){ 10 console.log('你好,我是'+this.name); 11 }}; 12 13 for( let k in obj){ 14 //判斷一下obj中的k是不是自己的,當然這不是咱們這篇文章主要研究的 15 if(obj.hasOwnProperty(k)){ 16 //這種不會破壞原型中的constructor的指向 17 Person.prototype[k] = obj[k]; 18 } 19 } 20 21 22 23 //2.經典繼承 24 Person.prototype = Object.create(obj); 25 26 //上面的代碼相當於 27 function create(obj){ 28 function P(){}; 29 P.prototype = obj; 30 return new P(); 31 } 32 33 34 //3.借用構造函數,這種方法繼承不過去 35 function Person(name,age){ 36 this.name = name; 37 this.age = age; 38 } 39 40 Person.prototype.sayHello = function(){ 41 console.log('你好,我是'+this.name); 42 } 43 44 function Human(name,age){ 45 Person.apply(this,arguments); 46 } 47 48 let p = new Human('jack',18); 49 console.log(p); 50 p.sayHello(); //p.sayHello is not a function 51 52 53 54 //4.直接替換,會改變obj1的constructor的指向 55 obj1.prototype = obj2.prototype;