JavaScript初學者必看“new”

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

譯者按: 本文簡單的介紹了new, 更多的是介紹原型(prototype),值得一讀。

  • 原文: JavaScript For Beginners: the ‘new’ operator

  • 譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。

<div style="text-align: center;"> <img style="width:81.8%;" src="javascript-new-for-beginner/new.jpeg" /> </div>

當你使用new的時候,會:

  1. 創建一個新的空對象;
  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;
//  }

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

<div style="text-align: center;"> <img style="width:61.8%;" src="javascript-new-for-beginner/proto.png" /> </div>

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,如果有就不會去原型中查找。

總結

也許這些概念對你來說有點多,但是當你理解了,使用原型可以讓你寫出更加高效的代碼。

關于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了7億+錯誤事件,得到了Google、360、金山軟件、百姓網等眾多知名用戶的認可。歡迎免費試用!

版權聲明

轉載時請注明作者Fundebug以及本文地址: https://blog.fundebug.com/2017/05/25/javascript-new-for-beginner/

轉載于:https://my.oschina.net/u/3375885/blog/2878504

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252992.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

libGDX-wiki發布

為方便大家學習和訪問&#xff0c;我將libgdx的wiki爬取到doku-wiki下&#xff0c;專門建立了以下地址。歡迎大家來共同完善。 http://wiki.v5ent.com 轉載于:https://www.cnblogs.com/mignet/p/ligbdx_wiki.html

I2C讀寫時序

1. I2C寫時序圖&#xff1a; 注意&#xff1a;最后一個byte后&#xff0c;結束標志在第十個CLK上升沿之后&#xff1a; 2. I2C讀時序圖&#xff1a; 注意&#xff1a;restart信號格式&#xff1b;讀操作結束前最后一組clk的最后一個上升沿&#xff0c;主機應發送NACK&#xff0…

網站性能優化

基本概念 1、網站吞吐量&#xff1a;TPS/每秒的事務數&#xff0c;QPS/每秒的查詢數&#xff0c;HPS/每秒的HTTP請求數 2、服務器性能指標&#xff1a;系統負載&#xff0c;內存使用&#xff0c;CPU使用&#xff0c;磁盤使用以及網絡I/O等 前端優化方法 1、減少HTTP請求&#x…

JAVA-容器(2)-Collection

&#xff08;基于JDK1.8源碼分析&#xff09; 一&#xff0c;Collection 所有實現Collection接口的類原則上應該提供兩種構造函數&#xff1a; 【1】無參構造-創建一個空的容器 【2】有參構造-創建一個新的Collection&#xff0c;這個新的Collection和傳入的Collection具有相同…

軟件測試工具LoadRunner中如何定義SLA?--轉載

軟件測試工具LoadRunner中如何定義SLA&#xff1f; 瀏覽&#xff1a;2242|更新&#xff1a;2017-04-09 22:50SLA 是您為負載測試場景定義的具體目標。Analysis 將這些目標與軟件測試工具LoadRunner在運行過程中收集和存儲的性能相關數據進行比較&#xff0c;然后確定目標的 SLA…

最近閱讀20171106

java面試題 線上服務內存OOM問題定位三板斧 JVM的GC ROOTS存在于那些地方 mysql innodb怎樣做查詢優化 ----未閱讀 JAVA CAS原理深度分析----未閱讀 轉載于:https://www.cnblogs.com/Tpf386/p/7793248.html

LinuxI2C驅動--從兩個訪問eeprom的例子開始

本小節介紹兩個在linux應用層訪問eeprom的方法&#xff0c;并給出示例代碼方便大家理解。第一個方法是通過sysfs文件系統對eeprom進行訪問&#xff0c;第二個方法是通過eeprom的設備文件進行訪問。這兩個方法分別對應了i2c設備驅動的兩個不同的實現&#xff0c;在后面的小結會詳…

Cookie詳解整理

1.Cookie的誕生 由于HTTP協議是無狀態的&#xff0c;而服務器端的業務必須是要有狀態的。Cookie誕生的最初目的是為了存儲web中的狀態信息&#xff0c;以方便服務器端使用。比如判斷用戶是否是第一次訪問網站。目前最新的規范是RFC 6265&#xff0c;它是一個由瀏覽器服務器共同…

驍龍820和KryoCPU:異構計算與定制計算的作用 【轉】

本文轉載自&#xff1a;https://www.douban.com/group/topic/89037625/ Qualcomm驍龍820處理器專為提供創新用戶體驗的頂級移動終端而設計。為實現消費者所期望的創新&#xff0c;移動處理器必須滿足日益增長的計算需求且降低功耗&#xff0c;同時還要擁有比以往更低的溫度&…

LNMP

準備工作 建立一個軟件包目錄存放 mkdir -p /usr/local/src/ 清理已經安裝包 rpm -e httpd rpm -e mysql rpm -e php yum -y remove httpd yum -y remove mysql yum -y remove php #搜索apache包 rpm -qa http* #強制卸載apache包 rpm -e --nodeps 查詢出來的文件名 #檢查是否卸…

算法復習——計算幾何基礎(zoj1081)

題目&#xff1a; Statement of the Problem Several drawing applications allow us to draw polygons and almost all of them allow us to fill them with some color. The task of filling a polygon reduces to knowing which points are inside it, so programmers have …

亞馬遜Rekognition發布針對人臉檢測、分析和識別功能的多項更新

今天亞馬遜Rekognition針對人臉檢測、分析和識別功能推出了一系列更新。這些更新將為用戶帶來多項能力的改今&#xff0c;包括從圖像中檢測出更多人臉、執行更高精度的人臉匹配以及獲得圖像中的人臉得到更準確的年齡、性別和情感屬性。Amazon Rekognition的客戶可以從今天開始使…

(轉)CentOS分區操作詳解

CentOS分區操作詳解 原文&#xff1a;http://blog.csdn.net/yonggeit/article/details/77924393 磁盤分區 分區格式的兩種選擇&#xff1a;MBR和GPT 分區命令&#xff1a; parted的操作都是實時生效的&#xff0c;小心使用&#xff0c;主要是用于大于2T硬盤&#xff0c;支持MBR…

linux驅動中地址空間轉換

在linux kernel 中&#xff0c;物理地址是不能直接使用的&#xff0c;必須通過轉換才可以。轉換分為兩種&#xff0c; 靜態和動態。 靜態就是下面那種&#xff0c;不過&#xff0c;靜態的地址轉換&#xff0c;還需要在kernel 初始化的時候作映射。 動態映射是使用 ioremap 函…

getClass()和.class的區別

getClass()和.class的區別 在學習反射時想到了這個問題&#xff0c;.getClass()和.class有沒有什么區別&#xff1f; 當然&#xff0c;最明顯的區別就是.getClass()是一個對象實例的方法&#xff0c;只有對象實例才有這個方法&#xff0c;具體的類是沒有的。類的Class類實例是通…

華為敏捷 DevOps 實踐:產品經理如何開好敏捷回顧會議

開篇小故事&#xff1a;前幾年&#xff0c;一本叫《沉思錄》的書在國內突然曝光度很多&#xff0c;因為前某國家領導人“擺案頭&#xff0c;讀百遍”。《沉思錄》是古羅馬皇帝馬可奧勒寫給自己的書&#xff0c;內容大部分是在鞍馬勞頓中寫的。其實有一句“我們所聽到的不過只是…

斐波那契數列的鬼畜的性質

斐波那契數列的鬼畜的性質 斐波那契數列定理1 \(gcd(f[i],f[i1])1\) 利用輾轉相減法 證明&#xff1a;\(gcd(f[i],f[i1])\)\(gcd(f[i1]-f[i],f[i])\)\(gcd(f[i-1],f[i])\)\(....\)\(gcd(f[1],f[2])1\) 斐波那契數列定理2 \(f[mn]f[m-1]f[n]f[m]f[n1]\) 證明&#xff1a;\(f[mn]…

xml與java對象轉換 -- XStreamAlias

XStreamAlias使用 一、 特點: 簡化的API; 無映射文件; 高性能,低內存占用; 整潔的XML; 不需要修改對象;支持內部私有字段,不需要setter/getter方法 提供序列化接口; 自定義轉換類型策略; XStream的優點很多&#xff0c;但是也有一些小bug&#xff0c;比如在定義別名中的下劃線…