国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

沒有對象?new一個!

DataPipeline / 1089人閱讀

摘要:這是為什么呢原因是構造函數中的并沒有指向當前的新對象,此時方法就可完美解決這個問題方法也可,具體的的使用及與的異同可參照大神文章。

我們都知道,使用new后可返回一個對象,通常用于實例化一個“類”。
用法:

function Student (name, age) {
    this.name = name;
    this.age = age;
}
Student.prototype.sayName = function() {
    console.log("I am "+ this.name);
}
const person =new Student("小明");
person.sayName();  // I am 小明
問題分析

首先我們分析一下,手動實現new需要什么。

創建一個函數,可返回一個新的對象

需要訪問到Student構造函數里的屬性

需要訪問到Student.prototype中的屬性和方法

具體步驟分析 一、參數傳遞

若要實現上面代碼的相同效果,首先明確需要一個“類”的參數,以及其它參數(如name)。
js 的函數參數非常靈活,形參數量可不確定(使用...args),也可不給出。函數中有一個 與生俱來的arguments對象,具有length屬性,但不是數組,所以不可使用數組方法。

arguments 簡單分析

下述代碼中的輸出語句結果即為所傳實參的集合:

{ "0": [Function: Student], "1": "小明", "2": 18 }

function objectFactory() {
    console.log(arguments);
}
const person = objectFactory(Student, "小明",18);
二、方法實現 1.得到 Student 類的構造函數

由前面 arguments 簡單分析可知,arguments中的第一個參數即為Student的構造函數。上面說到,arguments 并非數組,那我們如何得到第一項呢?

兩種方法:[].shift.call(arguments)Array.from(arguments)

var Constructor = [].shift.call(arguments);
2.創建一個新的對象

創建一個新的對象非常簡單,如下:

const obj = new Object();
3.設置新對象的 __proto__ 屬性

__proto__是對象的私有屬性,指向構造該對象的構造函數的原型。所以此步須將新的對象的此屬性指向 Constructor的原型。

obj.__proto__ = Constructor.prototype;
4.得到構造函數上的 this 屬性

若要實例化一個“類”,則必須調用其構造函數,在執行構造函數時,其 this的值是動態的變化的,即為當前調用該函數的對象。

可是這里有個問題,若此時直接調用構造函數并傳值

Constructor(arguments);

最終結果將為undefined

這是為什么呢?

原因是構造函數中的 this并沒有指向當前的新對象,此時apply()方法就可完美解決這個問題(call()方法也可),具體的apply()的使用及apply()call()的異同可參照大神文章。

結果:

function objectFactory(){
    var Constructor = [].shift.call(arguments);
    var obj = new Object();
    obj.__proto__ = Constructor.prototype;
    Constructor.apply(obj, arguments);
    return obj;
}

const person = objectFactory(Student, "小明", 18);
person.sayName();   // I am 小明
結束

對于手動實現new的學習,原型的概念更清晰了,在具體的實現過程中也學習到了shiftcallapply等方法的一些使用。收獲頗豐。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95414.html

相關文章

  • JavaScript 工廠函數 vs 構造函數

    摘要:當談到語言與其他編程語言相比時,你可能會聽到一些令人困惑東西,其中之一是工廠函數和構造函數。好的,讓我們用構造函數做同樣的實驗。當我們使用工廠函數創建對象時,它的指向,而當從構造函數創建對象時,它指向它的構造函數原型對象。 showImg(https://segmentfault.com/img/bVbr58T?w=1600&h=900); 當談到JavaScript語言與其他編程語言...

    RayKr 評論0 收藏0
  • javascript創建對象

    摘要:就是通過調用構造函數而創建的那個對象實例的原型對象。與寄生構造函數模式類似,使用穩妥構造函數模式創建的對象與構造函數之間也沒有什么關系,因此操作符對這種對象也沒有什么意義 雖然Object構造函數或對象字面量都可以用來創建單個對象,但是這些方法有明顯的缺點:使用同一個接口創建很多對象,會產生大量重復代碼。因此人們開始使用工廠模式。 工廠模式 這種模式抽象了創建具體對象的過程 funct...

    Keven 評論0 收藏0
  • 面向對象的小九九

    摘要:由構造函數返回的對象就是表達式的結果。如果構造函數沒有顯式返回一個對象,則使用步驟創建的對象。運算符返回一個布爾值,表示對象是否為某個構造函數的實例。 面向對象 本人能力有限,有誤請斧正 本文旨在復習面向對象(不包含es6) 本文學習思維 創建對象的方式,獲取對象屬性 構造函數,構造函數的new 做了什么 原型與原型對象 原型鏈 繼承(借用構造繼承、原型繼承、組合繼承、寄生組合繼承)...

    時飛 評論0 收藏0
  • 理解js對象

    摘要:將構造函數的作用域賦值給新對象因此指向了新對象執行構造函數的代碼為這個新對象添加屬性返回對象最初是用來標識對象類型的。但提到檢測對象類型,還是使用將構造函數當作函數構造函數與其他函數唯一區別。 創建對象 雖然Object構造函數與對象字面量都能創建單個對象, 但這些方式都有明顯的缺點: 使用同一個接口創建很多對象, 會產生大量重復代碼。 var obj = {}; //對象字面量 va...

    zhouzhou 評論0 收藏0
  • 【9】JavaScript 面向對象高級——對象創建模式

    摘要:解決了構造函數模式不能共享方法的問題。六寄生構造模式流程創建一個構造函數,在這個函數內部創建一個對象,用返回對象。除了使用操作符并把使用的包裝函數叫做構造函數以外,這個模式與工程模式其實是一模一樣的。 JavaScript面向對象高級——對象創建模式 一、工廠模式 流程: 定義一個函數,函數返回對象。 適用場景: 需要創建多個對象,都是Object類型。 優點:完成了返回一個對象的...

    linkin 評論0 收藏0
  • Java引用類型分析

    摘要:強引用是使用最普遍的引用,它是默認的引用類型,不需要顯式聲明,在中沒有實際的類對應,可以把它理解為的內置省略默認引用類型。相同點當執行時,兩者引用的對象都會被回收。這時已經無法獲得引用的對象,并且對象被放入了。 概述 java.lang.ref 類庫包含一組類,為垃圾回收提供了更大的靈活性。 java.lang.ref 有三個繼承自抽象類 Reference 的類: showImg(h...

    wyk1184 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<