1. 程式人生 > >建立物件的幾種方式和new關鍵字背後的原理

建立物件的幾種方式和new關鍵字背後的原理

一、建立物件的方式

     我總結了三種

1.使用字面量建立物件
  var obj1 = {a:1};
2.使用Object建構函式建立物件
  var obj2 = new Object({a:1});
3.使用建構函式建立物件
  function Foo(){
     this.a = 1
  };
  var obj3 = new FOO();
其實方法2和方法3是屬於同一種方式
4.使用Object.create()方法建立一個物件
  var obj4 = {a:1};
  var obj5 = Object.create(obj4);
通過Object.create方法建立的物件。
比如說方法4,obj5的原型就是obj4.

二、new關鍵字背後的原理

     這一塊我也不是很懂。

     簡而言之,就是說,

1.會建立一個新物件obj,繼承建構函式的prototype
2.執行建構函式,並將obj的上下文環境繫結
判斷建構函式的返回值,如果是一個物件,則返回該物件,如果不是,返回obj。
var new = function(fn){
   var obj = {};
   obj.__proto__ = fn.prototype;
   var res = fn.call(obj);
   return typeof res === 'object'?res:obj;
}

通過new運算子的原理,我們知道了,

function fn(){
   ...
}
var obj = new fn();
如果fn函式return了一個新物件,那麼這個新物件就會賦值給obj,而且該物件的原型鏈就會直接指向了Object.prototype;不是fn.prototype

相關推薦

建立物件方式new關鍵字背後原理

一、建立物件的方式     我總結了三種1.使用字面量建立物件 var obj1 = {a:1}; 2.使用Object建構函式建立物件 var obj2 = new Object({a:1}); 3.使用建構函式建立物件 function Foo(){

建立物件方式&&new關鍵字newInstance()方法的區別

轉載:http://www.kuqin.com/shuoit/20160719/352659.html 用最簡單的描述來區分new關鍵字和newInstance()方法的區別: newInstance: 弱型別。低效率。只能呼叫無參構造。 new: 強型別。相對高效。能呼叫

物件建立的三方式閉包的兩常用場景--js

物件建立的三種方式 ①通過new關鍵字建立物件 var obj = new Object(); obj.name = 'daxue'; obj.age = 28; obj.fun = function(){ } alert(obj.age); ②

執行緒程序的關係 ----執行緒建立方式

程序是一個應用程式在處理機上的一次執行過程,他是一個動態的概念 ,執行緒是程序的一部分是程式執行的最小單元 一個程序中有多個執行緒 個人理解 :             

Spring bean初始化與銷毀的方式區別

pack ack 構造 rop struct service() throws esc println 1. <bean> 元素的 init-method/destroy-method屬性指定初始化之後 /銷毀之前調用的操作方法 2. 指定方法上加上@PostC

清除浮動的方式兼容性處理

不容易 初學 str strong ott tex right pos 文檔流 清除浮動的幾種方式和兼容性處理 在清除浮動前我們要了解兩個重要的定義: 浮動的定義:使元素脫離文檔流,按照指定方向發生移動,遇到父級邊界或者相鄰的浮動元素停了下來。 高度塌陷:浮動元素父元素高度

深入研究Spring-IoC :容器建立方式

1.前言 本文為對tiny-spring的學習解讀,程式碼參考自tiny-spring。一個手寫的Spring簡易版框架。 前面已經提到了Spring IOC容器的建立大致分為3個步驟。但是這個三個步驟是有一個演進的過程的,Spring容器建立方式前後有6種,從最基本的例項化建立

vue常用建立元件方式總結

最近一週需要使用vue開發一個谷歌擴充套件外掛,但是又不能在vue-cli腳手架中開發,所以只能單獨引入vue.js整個包進行指令碼植入開發。引入vue.js就代表著不能用import、require之類的引入單檔案元件檔案,只能在檔案中開發,或者多個js檔案分先後順序植入開發,然後就出現了一個尷尬

建立物件時,=null new的區別

1.=null只是宣告一個物件,並不實際佔用空間。 如:HBPWDto hbpwDto = null; 相當於HBPWDto hbpwDto ; 2.new,把物件例項化了,這個物件會一直佔用空間(雖然不一定使用),直到被回收。 如果只是做賦值操作,只需要宣告就行了 ,在需要的時候再賦予

map遍歷的方式效率問題

一、map遍歷的效率 先建立一個map,新增好資料: Map<String, String> map = new HashMap<>(); for (int i = 0; i < 1000000; i++) { map.put(i +

Windows程序間共享核心物件方式

核心物件的控制代碼是程序相關的,這樣更可靠,更安全;Windows提供下列N種機制來允許程序共享核心物件。 使用物件控制代碼繼承 只有程序間存在父子關係才能使用物件控制代碼繼承;系統會遍歷父程序的控制代碼表將所有有效的控制代碼完整的複製到子程序的控制代碼表中(這

JS 之函式定義 & 建立物件方式

JS函式建立三種方式 JS建立物件三種方式 一、javaScript 函式建立的三種方式 <html> <head> <meta http-equiv="Content-Type" content="text/htm

Web開發中 前端路由 實現的方式適用場景

故事從名叫Oliver的綠箭蝦`說起,這位大蝦酷愛社交網站,一天他打開了 Twitter ,從發過的tweets的選項卡一路切到followers選項卡,Oliver發現頁面的內容變化了,URL也變化了,但為什麼頁面沒有閃爍重新整理呢?於是Oliver開啟的網路監控器(沒錯,Oliver是個程式設計師),他驚

servlet 資料儲存方式jsp 作用域

有5個物件儲存資料: ServletContext ---application  當tomcat服務一啟動,資料儲存一致有效,當tomcat服務一停止,ServletContext物件消失。 session----session   當第一次使用者輸入一個網址,且帶有一些

關於JAVA呼叫C++的方式一些問題 UnsatisfiedLinkError

關於JAVA呼叫C++的幾種方式和一些問題 java呼叫c++有幾種方式,1.JNA方式,2,JNative 方式,3.JNI 方式。: 1.JNA方式 public interface MyCLibrary extends Library {

PHP實現定時任務的方式詳解

定時執行任務對於一個網站來說,是一個比較重要的任務,比如定時釋出文件,定時清理垃圾資訊等,現在的網站大多數都是採用PHP動態語言開發的,而對於PHP的實現決定了它沒有Java和.Net這種AppServer的概念,而http協議是一個無狀態的協議,PHP只能被使用者觸

Python之匯入模組的方式import本質

匯入模組方法 import module_xxx  #匯入模組 import module1_ xxx, module2_ xxx  #匯入多個模組 from moudule_ xxx import say_hello #調取模組的指定一個功能(函式或類) fro

iOS-UIViewController建立方法UIWindow的介紹

在程式的啟動過程中提到如果沒有storyboard時:      * 程式啟動時候, 就會呼叫代理的application:  didFinishLaunchingWithOptions:方

《Cocos2d學習之路》九、資料儲存的方式基本使用

年前已經把這部分東西學完了,但是後面出現了一個bug,緊接著公司組織關係變更,搬家到新的地方上班等事情,忙完接著就回家過年了。終於,年後開始上班了,抽出空來把blog寫一下。 cocos2dx中資料儲存的幾種方式 1、userdefault 這個類似於android中

struts2建立action方式有什麼區別?

 當我們在寫action的時候,可以實現Action介面,也可以繼承Actionsupport這個類.到底這兩個有什麼區別呢? Action介面有: public static final java.lang.String SUCCESS = "success"; publ