Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Prototype - Fatal编程技术网

JavaScript-将原型添加到特定对象

JavaScript-将原型添加到特定对象,javascript,performance,prototype,Javascript,Performance,Prototype,因此,我花了几天时间试图找出在我的项目中实现以下功能的最佳实践: function addClass(myElem, myClass) { if (typeof myElem != "undefined" && myElem && myElem.nodeType === 1 && myClass) { myClass = (typeof myClass == "string" ? myClass.trim().rep

因此,我花了几天时间试图找出在我的项目中实现以下功能的最佳实践:

function addClass(myElem, myClass)
{
    if (typeof myElem != "undefined" && myElem && myElem.nodeType === 1 && myClass)
    {
        myClass = (typeof myClass == "string" ? myClass.trim().replace(/[\s]{2,}/g, ' ').split(", ").join(",").split(",").join(" ").split(" ") : myClass);

        for (var i = 0; i < myClass.length; i++)
        {
                myClass[i] = myClass[i].trim();
            if (myClass[i].length > 0 && hasClass(myElem, [myClass[i]], true) === false)
            {
                myElem.className += " " + myClass[i];
            }
        }

        return true;
    }

    return false;
}
函数addClass(myElem,myClass)
{
if(myElem的类型!=“未定义”&&myElem&&myElem.nodeType==1&&myClass)
{
myClass=(typeof myClass==“字符串”?myClass.trim().replace(/[\s]{2,}/g').split(“,”).join(“,”).split(“,”).join(“).split(”):myClass);
对于(var i=0;i0&&hasClass(myElem[myClass[i]],true)==false)
{
myElem.className+=“”+myClass[i];
}
}
返回true;
}
返回false;
}
此函数基本上与jQuerys$.addClass原型/函数具有相同的行为,但(目前)不支持内联调用(如内置函数:.trim(),.toLowerCase()等)

我已经读到,将原型扩展/添加到对象中并不是一个好的实践,如果您关心性能(我也这么做),就必须避免。但正如你所注意到的。。我对原型的了解不是很好,所以欢迎提供任何建议/答案

简而言之: 基本上我想实现这个函数,并且可以这样调用:document.body.addClass(“classtobeaded”)

我已经读到,将原型扩展/添加到对象并不是一个好的实践

这是一个意见问题,但它确实会增加冲突的可能性(例如,两个不同的脚本都将相同的方法添加到原型中)

如果您关心性能,则必须避免使用(我也这么做)

不,向原型对象添加东西不会对性能产生任何显著影响;创建对象后替换对象的原型可以,但不需要这样做

基本上我想实现这个函数,并且可以这样调用:document.body.addClass(“classtobeaded”)

您可以将其添加到
HTMLElement.prototype

Object.defineProperty(HTMLElement.prototype, "addClass", {
    value: function() {
        // ...your code here...
    }
});
这适用于所有现代浏览器,也适用于IE8

例如:

//扩展名
Object.defineProperty(HTMLElement.prototype,“addClass”{
值:函数(cls){
//假设addClass是不必要的,不使用classList
//如果浏览器支持类列表:-)
this.className+=“”+cls;
}
});
//使用它
文件.body.addClass(“foo”);
document.getElementById(“test”).addClass(“bar”)
.foo{
颜色:绿色;
字体大小:粗体;
}
.酒吧{
边框:1px纯蓝色;
}

这是一个测试

如果此代码有效,但可以改进,则此处不再赘述。这应该在代码审查中,让人们检查您的工作代码。@Carcigenicate这是关于实现的。。不复习。我试图找出如何将这个函数作为一个原型绑定到对象上(这样我就可以像我在回答中提到的那样调用它们)。。你是个天才!感谢您的时间,并回到引用的句子。我读过,添加原型可能会导致优化冲突。来源:@Bilal075_579;:这是指替换现有对象的原型,而不是添加到现有原型对象。该死。。误读了。感谢您的时间,我将尽快接受您的回答:)扩展本机原型可能仍然会导致意外的副作用,例如,当第三方脚本循环通过原型属性时。如果在标准中向原型添加同名函数,那么您的代码可能会破坏未来的web标准。我知道这两种情况都不太可能发生,但仍需记住。@nilsaddclass是一个“大”例子。我总是使用供应商/前缀来命名。所以在这种情况下,它将是strixAddClass。这还会有冲突的风险吗?我想可能性较小吧?