亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何理解關于構造函數的這段代碼?

如何理解關于構造函數的這段代碼?

牧羊人nacy 2018-12-28 15:14:21
var Class = function () {    var klass = function () {    };    klass.prototype.init = function () {};    // 定義 prototype 的別名    klass.fn = klass.prototype;    // 定義類的別名    klass.fn.parent = klass;    // 給類添加屬性    klass.extend = function (obj) {        var extended = obj.extended;        for (var i in obj) {            klass[i] = obj[i];        }        if (extended) extended(klass)    };    // 給實例添加屬性    klass.include = function (obj) {        var included = obj.included;        for (var i in obj) {            klass.fn[i] = obj[i];        }        if (included) included(klass)    };    return klass;};var Person = new Class;Person.include({    save: function(id) { console.log("id is: " + id); },    exists: function(id) { /* ... */ }});var person = new Person;person.save();關于兩個new的問題,第一個是new的是klass的實例,第二個new的是什么?打印出來的Person的原型是klass,person也是klass?這是什么情況?還是我完全理解錯了?
查看完整描述

1 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

根據 MDN new 操作符:

當代碼 new foo(...) 執行時:

  1. 一個新對象被創建。它繼承自foo.prototype.

  2. 構造函數 foo 被執行。執行的時候,相應的傳參會被傳入,同時上下文(this)會被指定為這個新實例。new foo 等同于 new foo(), 只能用在不傳遞任何參數的情況。

  3. 如果構造函數返回了一個“對象”,那么這個對象會取代整個new出來的結果。如果構造函數沒有返回對象,那么new出來的結果為步驟1創建的對象,ps:一般情況下構造函數不返回任何值,不過用戶如果想覆蓋這個返回值,可以自己選擇返回一個普通對象來覆蓋。當然,返回數組也會覆蓋,因為數組也是對象。

根據第 3 條, 所以, 在該例中, 構造函數Class通過return klass;返回一個函數這一對象, 所以通過該對象可以再次構造Person類的實例. 
在 Javascript 中, 函數也是對象. 根據MDN function:

在 JavaScript 中, 每個函數實際上都是一個Function對象。


查看完整回答
反對 回復 2019-01-03
  • 1 回答
  • 0 關注
  • 528 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號