Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
建设者能帮我吗?(即JavaScript中的构造函数有什么好处?)_Javascript - Fatal编程技术网

建设者能帮我吗?(即JavaScript中的构造函数有什么好处?)

建设者能帮我吗?(即JavaScript中的构造函数有什么好处?),javascript,Javascript,我已经使用GoogleCharts+jQueryAPI编写了一些很好的包装,当你鼠标悬停时,这些包装会进行很好的更新。我目前正在重构我的代码。我有一些函数返回具有属性的对象,这些对象本身具有其他属性,等等。有很多函数返回包含属性的对象的数组,其中一些是数组,等等 下面是我从ajax XML树加载ROC和似然表集合的代码示例: function XMLAttributeTable(subtree, point_name, arr_of_attributes) { // note: assu

我已经使用GoogleCharts+jQueryAPI编写了一些很好的包装,当你鼠标悬停时,这些包装会进行很好的更新。我目前正在重构我的代码。我有一些函数返回具有属性的对象,这些对象本身具有其他属性,等等。有很多函数返回包含属性的对象的数组,其中一些是数组,等等

下面是我从ajax XML树加载ROC和似然表集合的代码示例:

function XMLAttributeTable(subtree, point_name, arr_of_attributes) {
    // note: assumes numeric attribute values
    var attributes_for_each_point = [];
    $(subtree).find(point_name).each(function() {
    row = $(this);
    var point = {};
    arr_of_attributes.forEach( function(attr_name) { 
        point[attr_name] = parseFloatPlus(row.attr(attr_name));
    });
    attributes_for_each_point.push(point);
    });

    return attributes_for_each_point;
}

function XMLAttributeTableCollection(subtree, instance_name, point_name, arr_of_attributes) {
    // note: assumes the series are in order
    var tables_for_each_instance = [];
    $(subtree).find(instance_name).each( function() {
    tables_for_each_instance.push( XMLAttributeTable( this, "point", arr_of_attributes ) );
    });
    return tables_for_each_instance;
}

function getROCSeriesForEachRanking(roc_subtree) {
    return XMLAttributeTableCollection(roc_subtree, 'roc_series', 'point', ['index', 'target_groups', 'q_value']);
}

function getLikelihoodSeriesForEachRanking(likelihood_subtree) {
    return XMLAttributeTableCollection(likelihood_subtree, 'likelihood_series', 'point', ['index', 'likelihood']);
}
这里有很多这样的函数,我不是很喜欢(感觉很难区分关注点)。我可能会因为尝试使用其他语言(如C++)的语义编写JavaScript而感到内疚,如果是这样的话,谢谢你的建议。但我无法摆脱有代码气味的感觉

所以我的问题是,JavaScript中的构造函数有什么好处?如果没有强类型或强制封装的实用选项,那么为什么要使用构造函数呢?在这种情况下,我似乎不知道如何使用成员函数来改善我的生活,所以“继承”似乎不是很有用


非常感谢您提供的任何建议

尽管JavaScript是动态的、弱类型的,而且使用操作符
new
似乎是Brendan Eich为了让语言看起来更像C和Java而投入的一种手段,而他真正想要的是一种类似Scheme的语言(请参阅此apochryphal故事的更多信息),您可以从构造器中获得一些优势:

  • 许多人从JavaScript的早期就开始使用构造函数,并且很容易理解您的代码

  • 在创建对象的表达式中使用new操作符看起来就像是在创建一个新对象。如果您的函数被称为
    XmlAttributeTable
    ,并且您在不使用
    new
    的情况下将其作为函数调用,那么您正在创建任何东西就不太清楚了。也就是说,如果调用方法
    newTable
    createTable
    makeTable
    ,也可以

  • 构造函数带来了一点魔力,如果使用
    Object.create
    ,则需要额外的代码行。这包括简化构造和让原型具有构造函数属性

  • 考虑:

    function Point(x, y) {
        this.x = x
        this.y = y
    }
    

    function makePoint(x, y) {
        var point = Object.create(theProtoPointIDeclaredEarlier);
        point.x = x;
        point.y = y;
        return this;
    }
    
    我已经读过好几次了,使用
    Object.create
    应该比使用
    new
    更可取,但我真的不认为操作符
    new
    那么邪恶。我知道很多人可能不同意这一点,这没关系。Eich声称在10天的JavaScript设计中犯了一些“错误”(参见他在JSConf 2010上的主题演讲),但我从未听过他对构造函数感到遗憾

    因此,构造函数风格的编码可能有助于提高可读性,尤其是在创建大量似乎属于同一类型的对象时。然而,这样的风格可能不适合你

  • 如果有许多一次性对象看起来不属于同一“类型”,那么请避免使用构造函数,将对象作为命名属性的容器处理。这完全没问题

  • 请记住,JavaScript不是基于类的OOP语言,所以如果需要派生属性,请使用原型。在JavaScript这样的语言中,继承并不是您非常关心的事情(Crockford在几个不同的地方很好地阐述了这一点)。仅仅因为继承对您没有帮助,不需要构造函数是错误的。构造函数可以在不进行任何继承的情况下使用

  • 因此,不管你是否想使用构造函数,IMHO的关键在于你是否有很多看起来相同的对象,而不是你是否有一次性的对象。但是你可以很容易地不用它们。特别是在前一种情况下,原型对象可以很好地保持公共行为。但您可以将常见行为放入带有
    对象的原型中。也可以创建


    当您询问“代码气味”时,我可能不需要getter方法。现代JavaScript允许您使用
    get
    属性创建属性,当您想要读取属性并执行代码时,该属性是干净的。IMHO比使用
    get
    命名方法更好。此外,如果你的getter不仅仅是访问一个属性,你可以找到一个更好的名称。

    你在调用什么构造函数?有些函数只创建对象并返回它们。JavaScript中的构造器一词通常用于设计为使用新操作符调用的函数;它们隐式地创建并返回一个新对象,并使用this表达式初始化其属性。你是指那些类型的东西,还是指你使用它们的方式使用的函数?@RayToal正是我的问题——在这里使用构造函数有什么好处吗?它能帮助我分离关注点或更好地组织代码吗?@Oliver constructors允许原型设计和继承,但在我看来,你更想寻找一种清理命名空间的方法,所以我要说:对象可以有方法,函数可以是对象的属性。创建一个对象作为所有相关函数的域。@奥利弗JavaScript代码看起来像C++或java代码,使用对象文字而不是8个参数函数,它会使代码更可读。我理解你的沮丧,也许读一下Addy Osmani的《学习JavaScript设计模式》?
    Point
    的两个版本都很愚蠢,如果你有
    x
    y
    ,并且想强调一点,明智的做法是
    {x:x,y:y}
    接受这种语言:)我不反对points;这只是一个例子