JavaScript:动态扩展原型是一种不好的做法吗?

Posted

技术标签:

【中文标题】JavaScript:动态扩展原型是一种不好的做法吗?【英文标题】:JavaScript: is extending prototype dynamically a bad practice? 【发布时间】:2016-09-06 13:50:36 【问题描述】:

我想知道动态扩展函数的原型是否是一种不好的做法。我正在考虑使用接收属性名称和要添加到原型的函数的静态方法来执行此操作。

这是一种不好的做法吗?

function Test() 
    this.condition = false;


Test.extend = function(id, task) 
    this.prototype[id] = function() 
        return task.apply(this, arguments);
    ;
;

【问题讨论】:

只有当你滥用它到难以跟踪的地步时(坦率地说,这通常是会发生的)。就个人而言,我宁愿在我的编程中不达到那种级别的元数据。 这是一种不好的做法,因为您的代码不起作用 :-) 它需要是 task 而不是 this.task,并且应该缩短为 this.prototype[id] = task; 我不确定,但我猜.apply 存在一些性能问题。 @Rajesh 的应用性能问题?从何时起?更不用说整个事情都假设动态修改原型,这比使用Function.prototype.apply... 这种做法,你所呈现的方式是个坏主意:只是向原型添加随机方法,这些方法会即时修改由给定构造函数创建的每个现有对象。 .apply 也不是必需的。一般来说,作为经验法则,继承是不好的。通过查看源代码看不到的继承更糟糕。并且原型继承仍然是继承。 【参考方案1】:

我会说在这种情况下这是不好的做法,因为您无法控制正在添加的 [id] 方法是否从类中被覆盖。

var test = new Test();
test.extend("example", function() 
    console.log("First Method");
);

test.extend("example", function() 
    console.log("Second Method");
);

对于您的代码,您无法知道第一个方法何时被覆盖,从而随机破坏您的代码。

【讨论】:

嗯,这可以解决在添加新方法之前检查添加到原型的方法。但是如果你有这个检查,以这种方式扩展原型是一种不好的做法?

以上是关于JavaScript:动态扩展原型是一种不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

匿名函数在 JavaScript 中是一种不好的做法吗?

用私有属性替换类中的每个字段是一种不好的做法吗? [复制]

为啥直接从 Servlet 访问 DAO 是一种不好的做法?

为啥使用“评估”是一种不好的做法?

从后台线程更新 UI 是一种不好的做法,为啥? [关闭]

为啥单身人士被认为是一种不好的做法? [复制]