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();
複製代碼
- 函數名首字母大寫
function Person(){}
- 這是爲了區別於普通的函數,構造函數自己其實就是普通的函數,只是咱們專門用它來實現了構造的功能,因此專門起了一個名字叫構造函數,任何函數均可以成爲構造函數,這取決於你調用函數的方式,當使用了New的方式調用就成了構造函數。
- 當用New去調用一個函數的時候,this的指向會不同。
- 每new一次,系統都會新建立一個內存,這兩個對象各自有各自的內存空間,但他們具備相同的功能,還不共用。
- showName()方法是共享的,也就是說他們共用一個內存,更進一步的說它們存在引用關係。
- 因此咱們能夠把能夠共享複用的方法放在函數的
prototype
上,不想共享的能夠經過構造函數new
來調用。
prototype
1.每一個函數都有一個
prototype
屬性,他被稱爲原型對象;javascript
- 咱們能夠經過
Person.prototype.showName
把方法和屬性寫在它上面;
- 而經過
var person = new Person('hello')
這個函數建立出來的實例對象,都能共享這個原型對象下的方法和屬性;
_proto_
- 每一個實例化對象都有
_proto_
屬性,它是一個指針,指向函數的prototype
,也就是保存了它的地址。有了地址就能找到對象。
- 調用
person2.__proto__
屬性,保存了構造函數的原型對象的地址,經過這個屬性就能夠擁有原型對象下的全部屬性和方法,_proto_
屬性實際就是實例化對象和原型對象之間的鏈接
- 全部的函數都有
prototype
屬性,它指向原型對象;prototype
是一個對象,瀏覽器默認給他開闢堆內存
- 每個函數的原型對象都有的默認屬性
constructor
指向當前類的自己
- 每個實例(對象),都有一個
__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
複製代碼