1. 程式人生 > >原型鏈與繼承(三):理解Object.create()

原型鏈與繼承(三):理解Object.create()

Object.create(proto[, propertiesObject]):接受兩個引數,返回一個物件引數一:proto應該是新建立物件的prototype引數二:可選。該引數物件是一組屬性與值,該物件的屬性名稱將是新建立的物件的屬性名稱,值是屬性描述符(這些屬性描述符的結構與Object.defineProperties()的第二個引數一樣)。注意:該引數物件不能是 undefined,另外只有該物件中自身擁有的可列舉的屬性才有效,也就是說該物件的原型鏈上屬性是無效的。例子一:只傳一個引數:
var proto = {name:'allen'}
var p = Object.create(proto)
p.name//"allen"
例子二:傳入兩個引數:由第二個引數定義的屬性相當於直接複製到新建的物件中,而不是通過prototype原型鏈進行查詢,因此可以用hasOwnProperty來檢測:
var  proto = {name:'allen'};
var  p = Object.create(proto,{age:{value:21}});
p.hasOwnProperty('age');//true
我們來看看Object.create()究竟做了什麼:首先通過new Object()的形式建立一個臨時物件temp,該物件最終被返回,然後將__proto__(FireFox, Chrome才有)屬性指向傳入的proto,接著檢測第二個引數,如果為一個物件,就將裡面的值複製到temp之中,使其成為temp的自有屬性。這裡假設proto是通過物件字面量的形式建立的,這 相當於呼叫new Object(),也就是:proto = {} 等價於 proto = new Object();用圖來解釋就是:
在上面的程式碼中,測試一下:
var proto = {name:'allen'};
var p = Object.create(proto);
p.__pro__.__pro__.__pro__ === null;//true
p.__pro__.__pro__ = Object.prototype//true
即使proto是通過其他建構函式的形式建立,由於函式也是物件,最終也會通過原型鏈鏈查詢到這裡.Object.create()最初由Douglas Crockford 提出:最終被ES5才有的,對於老版本的瀏覽器可以自己實現一個簡化版:
Object.create = Object.create || function( obj ){
    var F = function(){};
    F.prototype = obj;
    return new F();
}
升級版(來自MDN):
if (typeof Object.create !== "function") {
    Object.create = function (proto, propertiesObject) {
        if (typeof proto !== 'object' && typeof proto !== 'function') {
            throw new TypeError('Object prototype may only be an Object: ' + proto);
        } else if (proto === null) {
            throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument.");
        }

        if (typeof propertiesObject != 'undefined') throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument.");

        function F() {}
        F.prototype = proto;

        return new F();
    };
}


相關推薦

原型繼承理解Object.create()

Object.create(proto[, propertiesObject]):接受兩個引數,返回一個物件引數一:proto應該是新建立物件的prototype引數二:可選。該引數物件是一組屬性與值,該物件的屬性名稱將是新建立的物件的屬性名稱,值是屬性描述符(這些屬性描述符

原型繼承六種常見繼承模式

一、原型鏈繼承: function SuperType(){ this.colors = ["red", "blue", "green"]; } SuperType.prototype.Fun = function(){ }; function SubType(){ } //

由散列表到BitMap的概念應用面試中的海量資料處理

一道面試題 在面試軟體開發工程師時,經常會遇到海量資料排序和去重的面試題,特別是大資料崗位。 例1:給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4G,找出a、b檔案共同的url? 首先我們最常想到的方法是讀取檔案a,建立雜湊表,然後再讀取檔案b,遍歷檔

原型物件的性質更簡單的原型語法

一、重寫整個原型物件 用一個包含所有屬性和方法的物件字面量來重寫整個原型物件。 function Person(){ } //更繁瑣的寫法 Person.prototype.name="Nicholas"; Person.prototype.age=29; Pe

NumPy陣列基礎計算Numpy陣列切片

Numpy的語法與python語法的切片方法相同 獲取陣列切片的方法: x[start:stop:step] 三個函式有預設值,三個引數預設值為start=0,stop=維度的大小,step=1。 1、一維子陣列 x=np.arange(10) x array(

Android音訊實時傳輸播放AMR硬編碼硬解碼

轉載請註明出處! 在Android中我所知道的音訊編解碼有兩種方式: (一)使用AudioRecord採集音訊,用這種方式採集的是未經壓縮的音訊流;用AudioTrack播放實時音訊流。用這兩個類的話,如果需要對音訊進行編解碼,就需要自己移植編解碼庫了,比如可以移植il

目標檢測分割SSD詳解

SSD github : https://github.com/weiliu89/caffe/tree/ssd SSD paper : https://arxiv.org/abs/1512.02325 SSD eccv2016 slide pdf : http://d

linux服務安裝配置配置安裝telnet服務

# netstat -tpa Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State

js 原型繼承

部分 聲明 ole 重復 操作 param urn 構造 cti 在理解繼承之前,需要知道 js 的三個東西: 什麽是 JS 原型鏈 this 的值到底是什麽 JS 的 new 到底是幹什麽的 1. 什麽是 JS 原型鏈? 我們知道 JS 有對象,比如 va

C++ STL開發溫習總結 3.C++函式技術

C++ STL開發溫習與總結(三): 3.C++函式技術        幾乎所有的C++類都有一個或多個建構函式,一個解構函式和一個賦值操作符。        對於任何一個類A,如果不想編寫上述函式,C++編譯器將自動為A產生4個預設的函式,如下:

Python用Selenium做自動化測試Page Object專題

Page Object專題 頁面物件模型的設計優勢: 創造可以被多個測試用例共享的可重用程式碼。 減少大量重複的程式碼。 如果使用者介面發生改變,則修改只用在一處進行。 圖片來源: 目的:測試程式碼與被測頁面物件程式碼分離,後期如果有頁面元素髮生了更改,

C#中的深度學習理解神經網路結構

在這篇文章中,我們將回顧監督機器學習的基礎知識,以及訓練和驗證階段包括哪些內容。 在這裡,我們將為不瞭解AI的讀者介紹機器學習(ML)的基礎知識,並且我們將描述在監督機器學習模型中的訓練和驗證步驟。 ML是AI的一個分支,它試圖通過歸納一組示例而不是接收顯式指令來讓機器找出如何執行任務。ML有三種正規化:監督

javascript精雕細琢作用域作用域

目錄 引言        作用域與作用域鏈是JS應用中無時無刻不在影響程式執行的關鍵屬性,但是由於它的不可見性,或者說它存在的過於普遍,簡直就像空氣一樣。所以對它的談及,都很簡單,而理解起來也不復雜。        但是由於它的重要性,對它做一個篇幅的說明,也是一件理所應當的事情。而且它其實也並沒有理解上

PHP面向物件繼承多型

1、繼承     繼承性:B類的物件擁有A類的全部屬性與行為,稱作B對A類的繼承。     好處:     1:提高了程式碼的複用性。     2:讓類與類之間產生了關係,提供了另一個特徵多型的前提     弊端:     打破了封裝性。對於一些類,或者類中功能,

Javascript面向對象編程非構造函數的繼承對象的深拷貝淺拷貝

content 實現 blank jquery實現 ted -i {} 發生 soc Javascript面向對象編程(三):非構造函數的繼承 作者: 阮一峰 日期: 2010年5月24日 這個系列的第一部分介紹了"封裝",第二部分介紹了使用構造函數實現"繼

攻略前端面試官JS的原型原型

本文在個人主頁同步更新~ 背就完事了 介紹:一些知識點相關的面試題和答案 使用姿勢:看答案前先嚐試回答,看完後把答案收起來檢驗成果~ 面試官:什麼是建構函式 答:建構函式的本質是一個普通函式,他的特點是需要通過`new`關鍵字來呼叫,用來建立物件的例項。所有的引用型別,如[],{},function等

並發編程從AQS到CountDownLatchReentrantLock

splay public 繼續 for admin font 通信 html integer 一、目錄 1、AQS簡要分析 2、談CountDownLatch 3、談ReentrantLock 4、談消費者與生產者模式(not

TF-IDF余弦相似性的應用自動摘要

下一步 dip target 似的 abs tps .net ebo ace 轉:http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html 有時候,很簡單的數學方法,就可以完成很復雜的任務。 這個

Git 教程倉庫分支

ide 不但 clas version span 右上角 director discard pre 遠程倉庫 到目前為止,我們已經掌握了如何在Git倉庫裏對一個文件進行時光穿梭,你再也不用擔心文件備份或者丟失的問題了。 可是有用過集中式版本控制系統SVN的童鞋會站出來說,這

Javascript面向對象非構造函數的繼承

pro query 遞歸調用 方法 lac .proto 但是 obj 獲得 這個系列的第一部分介紹了"封裝",第二部分介紹了使用構造函數實現"繼承"。 今天是最後一個部分,介紹不使用構造函數實現"繼承"。 一、什麽是"非構造函數"的繼承? 比如,現在有一個對象,叫做"中國