構造函數是一種特殊的函數,主要用來初始化對象,爲對象成員賦初始值,它與new 一塊兒使用。通常用於將公共屬性和方法抽取出來,封裝到函數中。javascript
new 在執行時會作四件事:java
class Person { constructor(name, age){ this.name = name this.age = age } say(){ console.log('my name is ' + this.name) } } const jack = new Person('jack', 20) jack.say() // 打印 my name is jack
構造函數存在的問題:函數
若是直接在構造函數上添加方法,每次new一個新對象,會單獨開闢一塊新的內存空間。因爲方法是通用的,每次new新對象都佔用部份內存資源比較冗餘浪費內存空間。所以在構造函數中定義方法通常會定義在它的原型鏈上,讓全部new出來的新對象共享同一個對象上的方法。ui
構造函數的原型this
每一個函數都有一個prototype 屬性,這個prototype也是一個對象, 是JavaScript默認添加的,通常把這個對象稱之爲原型對象。而構造函數擁有這個原型對象全部的屬性和方法。spa
構造函數經過原型對象分配的函數是全部new出來的新對象共享的。所以在使用中咱們能夠把一些不變的方法直接定義在prototype對象上,讓全部對象實例共享這些方法。prototype
function Person(name){ this.name = name } Person.prototype.say = function(){ console.log('打印', 'my name is ' + this.name) } const jack = new Person('jack') jack.say() // 打印 my name is jack
對象原型code
__proto__
的屬性,指向構造函數的prototype
原型對象。對象能使用構造函數的的原型對象prototype上的屬性和方法,就是由於__proto__
原型的存在。__proto__
對象原型和 prototype
構造函數原型是等價的。__proto__
對象原型的意義在於爲對象的查找機制提供一個方向,或者說一條路線。可是它是一個非標準屬性,在實際開發中,不可使用這個屬性,他的做用只是指向內部函數原型prototypeconst obj = {name : 'xiaowang'} console.log('打印', obj) // 打印 Object name: "xiaowang" __proto__: constructor: ƒ Object() __defineGetter__: ƒ __defineGetter__() __defineSetter__: ƒ __defineSetter__() hasOwnProperty: ƒ hasOwnProperty() __lookupGetter__: ƒ __lookupGetter__() __lookupSetter__: ƒ __lookupSetter__() isPrototypeOf: ƒ isPrototypeOf() propertyIsEnumerable: ƒ propertyIsEnumerable() toString: ƒ toString() valueOf: ƒ valueOf() toLocaleString: ƒ toLocaleString() get __proto__: ƒ __proto__() set __proto__: ƒ __proto__()
constructor 構造函數對象
__proto__
)和構造函數原型(prototype)裏面都有一個constructor屬性。constructor 稱之爲構造函數,它指回構造函數自己。function fn(){} console.log("打印", fn.prototype ); // 打印 {constructor: ƒ} constructor: ƒ fn() __proto__: Object console.log('打印', tom.__proto__) // 打印 {constructor: ƒ} constructor: ƒ Person(name) __proto__: Object
原型鏈ip
1.構造函數的原型protoptype指向Object的原型,Object的原型__proto__指向null。 2.對象實例的原型__proto__指向構造函數的原型prototype。
方法與屬性的查找規則
查找對象自己的__proto__
上的方法 => 查找原型對象prototype
上的方法 => 查找Object對象的__proto__
上的方法,若是Object上沒有則指向 null