簡體   English   中英

在JavaScript中模仿基於類的OOP構造函數

[英]Mimicking class-based OOP constructors in Javascript

快速說明: Javascript中的OOP是一個話題,在Stackoverflow和其他地方已被淘汰,但是我找不到在任何地方回答的特定問題。

Javascript對象中的“懸掛代碼”一直困擾着我,因為它似乎破壞了代碼流。 我所說的“懸掛代碼”如下:

function newObject()
{
    var thisObject = this;

    // HANGING CODE DOING VARIOUS THINGS SUCH AS
    // $('#someDiv').click(function(){}); OR
    // var someObjectLiteral = {value:'value'};
}

我想通過執行以下操作來模仿基於類的OOP構造函數:

function newObject()
{
    var thisObject = this;

    function construct()
    {
        //WHAT USED TO BE HANGING CODE
    }

    construct();
}

關於第二種方法,以下任何一項是正確的還是可能正確的:

  1. 它明顯慢
  2. 在某些情況下根本無法使用
  3. 它破壞了正確的編碼習慣
  4. 很難調試
  5. 有一種出色的方法可以達到相同的結果

謝謝。

就將代碼包裝到內部函數內而言,本質上沒有錯。 您唯一需要注意的是您不能在其他函數中使用this (需要使用中間變量,如yout thisObject

順便說一句, 我認為擁有“懸掛代碼” (至少在您的示例中顯示的那種) 根本沒有問題 諸如Java之類的語言可能已經訓練您將所有內容放到一個類中,但是在Java語言中,只有在您明確希望利用繼承或多態性的情況下,您才真正需要做的事情。

您可能需要稍微擺脫oop的思維方式。 例如,在您的情況下,新對象構造函數中的“掛起代碼”可能看起來很糟糕,但我只是將函數重命名為“ addClickHandler”或“ setLiterals”,並稱之為一天。

您可以使用類似MooTools類的方法,該方法比使用“懸掛”代碼的方法慢。 這主要是由於MooTools類具有與其“本機”結構相關的開銷。 很多東西可能不需要,也可能不需要。 聽起來好像您想要一些直截了當的東西。

您可以執行以下操作:

var Klass = function(attrs) {
    var key, newClass;

    attrs = attrs || {};

    newClass = function() {
        if(this.init) {
            this.init.apply(this, Array.prototype.slice.call(arguments));
        }
    };

    for(key in attrs) {
        newClass.prototype[key] = attrs[key]
    }

    return newClass;
};

然后,您可以執行以下操作:

var Person = new Klass({
    init: function(name, bg) {
        this.name = name;
        document.getElementById('container').styles.background = bg;
    },

    speak: function() {
        'I am ' + this.name;
    }
});

var tim = new Person('tim', 'blue');
// background now blue
tim.speak();
// 'I am tim'

var jane = new Person('jane', 'purple');
// background now purple
jane.speak();
// 'I am jane'

因此,當您創建類的新實例時,此代碼將觸發init()。 傳遞任何參數。 您可以在其中放置“懸掛”代碼。 由於原型的工作方式,該節點不允許您創建新實例的新實例。 並且您需要對其進行進一步更改,以允許諸如建立父類之類的事情。 但這是構建類結構的一種非常簡單的方法。

這應該可以正常工作。 如果您遇到某些“做不到”的事情,肯定會有一種糾正方法。 您可能只需要完成代碼。 正如我在上一段中所說的。 由於類基本上是要返回的函數,因此會產生一些開銷,然后您可以為其創建新的實例。 但是沒有什么太重要的。 至於最佳做法,我會說這還不錯。 有許多JS庫具有相當廣泛的類結構供您使用。 很多人都使用類。 但是,由於它們不是真正的本機JS類型,因此存在使用它們的爭論,並且會存在爭論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM