不知不覺的就看懂了 Javascript 面向對象

配合下面解釋再看例子

function Person(name){//形參用來接受實例傳過來的實參
        this.name = name;
    }
    
    Person.prototype.showName = function (){
        console.log(this.name);//person1打印hello person2打印world
    }
    
    var person1 = new Person('hello');
    person1.showName();
    
    var person2 = new Person('world');
    person2.showName();
    
    
複製代碼

構造函數

  1. 函數名首字母大寫 function Person(){}
  1. 這是爲了區別於普通的函數,構造函數自己其實就是普通的函數,只是咱們專門用它來實現了構造的功能,因此專門起了一個名字叫構造函數,任何函數均可以成爲構造函數,這取決於你調用函數的方式,當使用了New的方式調用就成了構造函數。

new 關鍵字調用

  1. 當用New去調用一個函數的時候,this的指向會不同。
  1. 每new一次,系統都會新建立一個內存,這兩個對象各自有各自的內存空間,但他們具備相同的功能,還不共用。
  1. showName()方法是共享的,也就是說他們共用一個內存,更進一步的說它們存在引用關係。
  1. 因此咱們能夠把能夠共享複用的方法放在函數的 prototype 上,不想共享的能夠經過構造函數 new 來調用。

prototype

1.每一個函數都有一個 prototype 屬性,他被稱爲原型對象;javascript

  1. 咱們能夠經過 Person.prototype.showName 把方法和屬性寫在它上面;
  1. 而經過 var person = new Person('hello') 這個函數建立出來的實例對象,都能共享這個原型對象下的方法和屬性;

_proto_

  1. 每一個實例化對象都有_proto_屬性,它是一個指針,指向函數的prototype,也就是保存了它的地址。有了地址就能找到對象。
  1. 調用person2.__proto__屬性,保存了構造函數的原型對象的地址,經過這個屬性就能夠擁有原型對象下的全部屬性和方法,_proto_屬性實際就是實例化對象和原型對象之間的鏈接

原型鏈

  1. 全部的函數都有 prototype 屬性,它指向原型對象;prototype是一個對象,瀏覽器默認給他開闢堆內存
  1. 每個函數的原型對象都有的默認屬性constructor指向當前類的自己
  1. 每個實例(對象),都有一個__proto__屬性,指向所屬類的原型
Person.prototype == person1.__proto__ //true

Person.prototype.constructor == person1.__proto__.constructor //true

Person.prototype.constructor.__proto__ == person1.__proto__.constructor.__proto__ //yrue

Person.prototype.__proto__ == Object.prototype //true

Person.prototype.__proto__ == Function.prototype.__proto__ //true

Function.prototype.__proto__ == Object.prototype //true
複製代碼
相關文章
相關標籤/搜索