js中的new file_JS中的new操作符

一、什么是new?

眾所周知,在JS中,new的作用是通過構造函數來創建一個實例對象。

像下面這樣:(和普通函數不一樣,當函數用作 構造函數 時,首字母一般要大寫,以作區分。)

function Foo(name) {    this.name = name;}console.log("new Foo('mm')的類型:",typeof new Foo('mm')); // objectconsole.log("Foo的類型:",typeof Foo); // function
423a0aad1afcfa4ce6af26ad592eba6d.png

二、new經歷了什么過程?

Foo明明只是一個函數,可是為什么new Foo()執行后會突然返回一個對象呢?

我們從結果出發可以推斷出,既然返回了一個對象,那么這事肯定和 對象 有關系。

實際上new幫我們做了這樣幾件事:

  1. 幫我們創建了一個空對象,例如:obj;
  2. 將空對象原型的內存地址 __proto__ 指向函數的原型對象;(這里涉及到了 原型鏈 的知識)
  3. 利用函數的call方法,將原本指向window的綁定對象this指向了obj。(這樣一來,當我們向函數中再傳遞實參時,對象的屬性就會被掛載到obj上。)
  4. 利用函數返回對象obj。

三、new的過程分析

function Foo(name) {    this.name = name;    return this;}var obj = {};obj.__proto__ = Foo.prototype;// Foo.call(obj, 'mm');var foo = Foo.call(obj, 'mm');console.log(foo);
c95d834439eb19aebf12e4fb0bfafa6c.png

分析:

首先預編譯,聲明提升,解釋執行。

執行時按照順序來進行,

  • obj指向空對象;
  • obj的原型地址指向構造函數Foo的原型對象;
  • 執行 Foo.call(obj, 'mm');this.name = name; 通過函數的 call方法 將this綁定到obj(也就是說this就是obj),實參mm傳入構造函數Foo中,這樣this.name = ‘mm’,那么obj.name = ‘mm’,也就是說name屬性被掛載到obj對象上。return this; 就是return obj,這樣obj這個對象就被返回出來了。
  • 將結果賦值給變量foo。
  • 打印結果。

四、總結

第三部分的代碼直接用 new 構造函數 效果是相同的。

function Foo(name) {    this.name = name;}var foo = new Foo('mm');console.log(foo);
e8a6425f8dd2a460569591fc66307a4a.png

簡而言之,new操作符幫我們做了四件事:

  1. 創建空對象;
  2. 空對象的原型指針指向構造函數的原型對象;
  3. 利用函數的call方法改變this指向,在空對象上掛載屬性或方法;
  4. 返回對象。

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

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

相關文章

css不繼承父類樣式_提升你的Python編程能力,細說類的繼承,拿走不謝

今天咱們聊點啥呢?要不還是聊點Python基礎的東東吧,大家已經都知道啦,Python呢是一種面向對象的腳本編程語言,那面向對象的編程語言呢,都會支持面向對象的三大特性,你知道是哪三大特性嗎?當然是…

R 回歸 虛擬變量na_【R語言進階】Logistic回歸及啞變量設置

點擊上方“藍字”,我們一起分析數據Logistic回歸是最常用的多因素回歸模型,在醫學研究中,常用于研究疾病的危險因素,下面我們一起來看看,R語言是如何實現Logistic回歸的。1第一步 導入數據首先,在excel里全選數據集,右鍵復制。然后&#xff0…

oracle快捷語句框架中,Oracle框架:PL/SQL編程:

PL/SQL編程一:什么是PL/SQL(1.)PL/SQL體系結構:PL/SQL引擎用來編譯和執行,PL/SQL塊或子程序,該引擎駐留在Oracle服務器中。(2.)PL/SQL塊簡介PL/SQL是一種塊結構語音,它將一組語句塊放在一個快中。(3.)運算符和表達式&a…

logisticregression參數_通俗地說邏輯回歸【Logistic regression】算法(二)sklearn邏輯回歸實戰...

前情提要:通俗地說邏輯回歸【Logistic regression】算法(一) 邏輯回歸模型原理介紹上一篇主要介紹了邏輯回歸中,相對理論化的知識,這次主要是對上篇做一點點補充,以及介紹sklearn 邏輯回歸模型的參數&#…

tensorflow適用于python版本_tensorflow用python哪個版本更好?

tensorflow用python哪個版本?一、安裝anaconda tensorflow是基于python腳本語言的,因此需要安裝python, 當然還需要安裝numpy、scipy、six、matplotlib等幾十個擴展包。如果一個個安裝,裝到啥時候去?(我曾經光安裝scip…

php parse url ctf,【SSRF】如何繞過filter_var(), preg_match() 和 parse_url()

0x01 前言這篇文章是在我看完一片國外安全大佬寫的文章后對其進行總結并翻譯得到的。0x02 正文之繞過filter_var和preg_match本片文章主要深入一種php ssrf的技術——如何繞過例如filter_var(), preg_match()和parse_url()等函數。本次我進行測試的php版本全部為php v5.6.30php…

python json解析_python讀取json文件并解析

原博文 2018-07-09 18:35 ? # -*- coding: utf-8 -*- import os import json import sys reload(sys) sys.setdefaultencoding(utf-8) filelistos.listdir(E:\\log\\files\\) for ite... 相關推薦 2019-12-05 20:03 ? 如何使用 Python 語言來編碼和解碼 JSON 對象。 JSON(Jav…

oracle進程瞬間暴增,oracle goldengate ogg 源段傳輸進程lag延遲不斷增加的原因?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓了解GoldenGate中LAG的含義GGSCI中顯示的LAG代表 事務被寫入到磁盤介質中的時刻例如Oracle中redo被寫入到online redo logfile中 和 Replicat將同一個事務分發到目標數據庫的時刻 之間的時間間隔。通俗地說,一個事務內的…

python中文詞云圖代碼_Python簡單實現詞云圖代碼及步驟解析

一、安裝 wordcloud pip install wordcloud 二、加載包、設置路徑 import os from wordcloud import WordCloud import matplotlib.pyplot as plt os.chdir(E:\\pyspace\\tmp) 三、詞云圖示例 1、默認參數示例 text Keep it simple and stupid. wc WordCloud() # 實例化詞云圖…

linux 命令 空格轉義,在Linux中,如何轉義SCP復制路徑中的空格?

問題描述我是Linux新手,我想將文件從遠程復制到本地系統…現在,我在Linux系統中使用scp命令。當我嘗試將其復制時,我有一些文件夾或文件名帶有空格文件,它顯示錯誤消息:“沒有這樣的文件或目錄”我試過了:s…

usb大容量存儲設備驅動程序_20年歷史了!為什么USB接口還存在?網友:原來如此...

USB接口作為計算機領域應用最廣泛的數據接口,已有20多年的歷史。和它的名字一樣,USB(Universal Serial Bus)最初也是為統一的數據接口而設計的。你幾乎可以用它來代替計算機的各種外部數據接口,只需為它設計相應的驅動程序。隨著市場對USB接口…

linux終端炫酷命令,你不得不知道11個炫酷的 Linux 終端命令

很多朋友都很喜歡Linux ,Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統,Linux是一款免費的操作系統,用戶可以通過網絡或其他途徑免費獲得,并可…

lasso回歸_一文讀懂線性回歸、嶺回歸和Lasso回歸

(圖片由AI科技大本營付費下載自視覺中國)作者 | 文杰編輯 | yuquanle本文介紹線性回歸模型,從梯度下降和最小二乘的角度來求解線性回歸問題,以概率的方式解釋了線性回歸為什么采用平方損失,然后介紹了線性回歸中常用的兩種范數來解決過擬合和…

springcloud架構特點_打造企業級微服務平臺架構,分布式應用場景管理

微服務平臺架構是一項在云中部署應用和服務的新技術。大部分圍繞微服務的爭論都集中在容器或其他技術是否能很好的實施微服務。微服務系統可以在“自己的程序”中運行,并通過“輕量級設備與HTTP型API進行溝通”。關鍵在于該服務可以在自己的程序中運行。通過這一點我…

linux 看防火墻的啟停日志,LINUX下防火墻iptables的日志管理

iptables的日志(log)由syslogd紀錄和管理。初始存放在 /var/log/messages里面。自動采取循環紀錄(rotation)的方式記錄。但是由于混在 messages中,對于管理和監視產生了不便。這里,我簡單介紹一下我的 iptables日志的管理,循環,和…

怎么判斷一個字符串的最長回文子串是否在頭尾_LeetCode 5 迅速判斷回文串的Manacher算法...

本文始發于個人公眾號: TechFlow題意Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.Link: https://leetcode.com/problems/longest-palindromic-substring/翻譯給定一個字符串s&#xff0c…

linux內核沒有iobuf,LINUX2.6.26.6內核下雙口RAM的驅動函數測試成功!

驅動程序:#include //#include #include #include #include #include #include #include //#include #include //#include #include #include #include #include //#include #include #include #include #include #include #include #include MODULE_LICENSE("…

spring和mybatis結合做簡單的增刪查改系統_springbootamp;amp;vue簡單的景點信息管理系統...

springboot&&vue簡單的景點信息管理系統這兩天閑著沒有什么事,就根據陳哥的教程,試著寫了一個springboot和vue的簡單的景點信息管理系統。也就大致實現了最基本的增刪查改。先看看效果圖吧:1、登陸界面: 2、注冊界面&…

linux 內核 丟棄分片包,LINUX內核關于IP分片重組問題請教

最近研究學習IP分片重組,也拜讀了不少dx的閱讀理解。可還是有疑問,請教xdm。源代碼:linux-2.4.26\linux-2.4.26\net\ipv4\ip_fragment.cIP分片的重組大概經過以下幾個函數:0/ ip_defrag1/ ip_find-->ip_frag_create-->ip_frag_intern2/…

spark算子_十、Spark之詳解Action類算子

常用Action類算子列表reduce(func): 通過func函數來對RDD中所有元素進行聚合運算,先運算分區內數據,再運算分區間數據。scala> val rdd1 sc.makeRDD(1 to 100)rdd1: org.apache.spark.rdd.RDD[Int] ParallelCollectionRDD[4] at makeRDD at :24# 對…