91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中new的功能有哪些

發布時間:2022-04-11 09:01:19 來源:億速云 閱讀:160 作者:iii 欄目:web開發

這篇“JavaScript中new的功能有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“JavaScript中new的功能有哪些”文章吧。

JavaScript中new的功能有哪些

前言

什么是new呢?

new運算符創建一個用戶定義的對象類型的實例或具有構造函數的內置對象類型之一。

光看定義還是有幾分晦澀,直接看一個具體的例子,來了解一下JavaScript中的new實現的功能。

舉個例子

// 現實中瘦不了,但網絡中一定要保持苗條
function Thin_User(name, age) {
    this.name = name;
    this.age = age;
}

Thin_User.prototype.eatToMuch = function () {
    // 白日做夢吧,留下肥胖的淚水
    console.log('i eat so much, but i\'m very thin!!!');
}

Thin_User.prototype.isThin = true;

const xiaobao = new Thin_User('zcxiaobao', 18);
console.log(xiaobao.name);   // zcxiaobao
console.log(xiaobao.age);    // 18
console.log(xiaobao.isThin); // true
// i eat so much, but i'm very thin!!!
xiaobao.eatToMuch();

通過上面這個例子,我們可以發現xiaobao可以:

  • 訪問到構造函數Thin_User中屬性

  • 訪問到Thin_User.prototype中屬性

描述得更直白一點,new做了這些事:

  • 創建了一個空對象,對象的__proto__->Thin_User.prototype

  • 執行構造函數,并將this指向新對象

  • 返回新對象

補充說明

由于new是關鍵字,我們無法像模擬數組高階方法一樣覆蓋,因此我們寫一個函數createObject,來模擬new的效果。使用具體如下:

function Thin_User(name, age) {}

const u1 = new Thin_user(...)
const u2 = createObject(Thin_User, ...a\)

初步模擬

根據上面分析,createObject編寫的大致步驟為:

  • 創建一個新對象obj

  • 設置obj.__proto__->constructor.prototype(但JavaScript不推薦直接修改__proto__屬性,提供了setPrototypeOf方法來專門修改原型)

  • 使用constructor.call/apply(obj, ...),將屬性添加到obj

  • 返回obj

__proto__和prototype,可以看JavaScript之徹底理解原型與原型鏈
call/apply,可以看JavaScript之手撕call、apply

學習完這些,我們就可以編寫第一版代碼:

function createObject(Con) {
    // 創建新對象obj
    // var obj = {};也可以
    var obj = Object.create(null);

    // 將obj.__proto__ -> 構造函數原型
    // (不推薦)obj.__proto__ = Con.prototype
    Object.setPrototypeOf(obj, Con.prototype);

    // 執行構造函數
    Con.apply(obj, [].slice.call(arguments, 1));

    // 返回新對象
    return obj;}

返回值效果

眾所周知,函數是有返回值的,那構造函數如果有返回值,最終執行new后返回的結果是怎樣的那?

返回值為基本類型

假設構造函數返回值為一個基本類型,我們來看一下最后的返回結果:

function Thin_User(name, age) {
    this.name = name;
    this.age = age;
    return 'i will keep thin forever';
}

Thin_User.prototype.eatToMuch = function () {
    console.log('i eat so much, but i\'m very thin!!!');
}

Thin_User.prototype.isThin = true;

const xiaobao = new Thin_User('zcxiaobao', 18);
console.log(xiaobao.name);   // zcxiaobao
console.log(xiaobao.age);    // 18
console.log(xiaobao.isThin); // true
// i eat so much, but i'm very thin!!!
xiaobao.eatToMuch();

最后的返回結果好像受到任何干擾,難道構造函數不會對返回值進行處理嗎?

不急,我們來接著測試一下返回值為對象的情況。

返回值為對象

function Thin_User(name, age) {
    this.name = name;
    this.age = age;
    return {
        name: name,
        age: age * 10,
        fat: true
    }
}

Thin_User.prototype.eatToMuch = function () {
    // 白日做夢吧,留下肥胖的淚水
    console.log('i eat so much, but i\'m very thin!!!');
}

Thin_User.prototype.isThin = true;

const xiaobao = new Thin_User('zcxiaobao', 18);
// Error: xiaobao.eatToMuch is not a function
xiaobao.eatToMuch();

當我執行eatToMuch時,控制臺直接報錯,沒有當前函數,于是我打印了xiaobao對象:
JavaScript中new的功能有哪些

發現xiaobao對象的age發生了改變,而且增加了fat屬性,正好與構造函數的返回值一樣。

看完這兩個例子,基本可以理清構造函數有返回值的情況:當構造函數返回值為對象時,直接返回這個對象。

終版模擬

function createObject(Con) {
    // 創建新對象obj
    // var obj = {};也可以
    var obj = Object.create(null);

    // 將obj.__proto__ -> 構造函數原型
    // (不推薦)obj.__proto__ = Con.prototype
    Object.setPrototypeOf(obj, Con.prototype);

    // 執行構造函數,并接受構造函數返回值
    const ret = Con.apply(obj, [].slice.call(arguments, 1));

    // 若構造函數返回值為對象,直接返回該對象
    // 否則返回obj
    return typeof(ret) === 'object' ? ret: obj;}

以上就是關于“JavaScript中new的功能有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长丰县| 浪卡子县| 伊通| 长乐市| 巴里| 崇州市| 炉霍县| 灌阳县| 枣庄市| 固镇县| 昌都县| 时尚| 湛江市| 台安县| 黔江区| 永嘉县| 白水县| 汉中市| 东乡族自治县| 新邵县| 平谷区| 龙泉市| 霍邱县| 襄城县| 塔河县| 邹平县| 漳州市| 依安县| 南京市| 鄂尔多斯市| 双辽市| 连南| 六枝特区| 罗山县| 石嘴山市| 射洪县| 东平县| 白城市| 北票市| 元阳县| 嘉荫县|