JavaScript 學者必看“new”

來源:互聯網
上載者:User

標籤:rac   變數   dea   ima   tostring   規則   func   控制台   用例   

當你使用new的時候,會:

1.建立一個新的Null 物件; 
2.將this綁定到該對象; 
3.添加一個名為__proto__的新屬性,並且指向建構函式的原型(prototype); 
4.返回該this對象。

如果你沒有特別理解,那麼我們接下來用例子來詳細解釋。首先定義一個建構函式Student,該函數接收兩個參數nameage

function Student(name, age){ this.name = name; this.age = age;}

 

現在我們使用new來建立一個新的對象:

var first = new Student(‘John‘, 26);

 

到底發生了什麼呢?

1.一個新的對象建立,我們叫它obj; 
2.this綁定到obj,任何對this的引用就是對obj的引用; 
3.__proto__屬性被添加到obj對象。obj.__proto__會指向Student.prototype; 
4.該obj對象被賦值給first變數。

我們可以通過列印測試:

console.log(first.name);// Johnconsole.log(first.age);// 26

 

接下來深入看看__proto__是怎麼回事。

原型(Prototype)

每一個JavaScript對象都有一個原型。所有的對象都從它的原型中繼承對象和屬性。

開啟瀏覽器開發人員控制台(Windows: Ctrl + Shift + J)(Mac: Cmd + Option + J),輸入之前定義的Student函數:

function Student(name, age) { this.name = name; this.age = age;}

 

為了證實每一個對象都有原型,輸入:

Student.prototype;// Object {...}

 

你會看到返回了一個對象。現在我們來嘗試定義一個新的對象:

var second = new Student(‘Jeff‘, 50);

 

根據之前的解釋,second指向的對象會有一個__proto__屬性,並且應該指向父親的prototype,我們來測試一下:

second.__proto__ === Student.prototype// true

 

Student.prototype.constructor會指向Student的建構函式,我們列印出來看看:

Student.prototype.constructor;//  function Student(name, age) {//    this.name = name;//    this.age = age;//  }

 

好像事情越來越複雜了,我們用圖來形象描述一下:

Student的建構函式有一個叫.prototype的屬性,該屬性又有一個.constructor的屬性反過來指向Student構造。它們構成了一個環。當我們使用new去建立一個新的對象,每一個對象都有.__proto__屬性反過來指向Student.prototype

這個設計對於繼承來說很重要。因為原型對象被所有由該建構函式建立的對象共用。當我們添加函數和屬性到原型對象中,其它所有的對象都可以使用。

在本文我們只建立了兩個Student對象,如果我們建立20,000個,那麼將屬性和函數放到prototype而不是每一個對象將會節省非常很多的儲存和計算資源。

我們來看一個例子:

Student.prototype.sayInfo = function(){ console.log(this.name + ‘ is ‘ + this.age + ‘ years old‘);}

 

我們為Student的原型添加了一個新的函數sayInfo – 所以使用Student建立的學生對象都可以訪問該函數。

second.sayInfo();// Jeff is 50 years old

 

建立一個新的學生對象,再次測試:

var third = new Student(‘Tracy‘, 15);// 如果我們現在列印third, 雖然只會看到年齡和名字這兩個屬性,// 仍然可以訪問sayInfo函數。third;// Student {name: "Tracy", age: 15}third.sayInfo();// Tracy is 15 years old

 

在JavaScript中,首先查看當前對象是否擁有該屬性;如果沒有,看原型中是否有該屬性。這個規則會一直持續,直到成功找到該屬性或則到最頂層全域對象也沒找到而返回失敗。

繼承讓你平時不需要去定義toString()函數而可以直接使用。因為toString()這個函數內建在Object的原型上。每一個我們建立的對象最終都指向Object.prototype,所以可以調用toString()。當然, 我們也可以重寫這個函數:

var name = { toString: function(){   console.log(‘Not a good idea‘); }};name.toString();// Not a good idea

 

建立的name對象首先查看是否擁有toString,如果有就不會去原型中尋找。

原文:https://hackernoon.com/javascript-for-beginners-the-new-operator-cee35beb669e

JavaScript 學者必看“new”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.