javaScript構造函數、原型、原型鏈

構造函數是一種特殊的函數,主要用來初始化對象,爲對象成員賦初始值,它與new 一塊兒使用。通常用於將公共屬性和方法抽取出來,封裝到函數中。javascript

new 在執行時會作四件事:java

  1. 在內存中建立一個新的空對象。
  2. 讓this 指向這個新對象。
  3. 根據構造函數中的代碼,爲這個對象添加屬性和方法。
  4. 返回這個新對象。(構造函數不須要return)
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__ 對象原型的意義在於爲對象的查找機制提供一個方向,或者說一條路線。可是它是一個非標準屬性,在實際開發中,不可使用這個屬性,他的做用只是指向內部函數原型prototype
const 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 稱之爲構造函數,它指回構造函數自己。
  • 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

相關文章
相關標籤/搜索