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

6
我想知道动态地扩展函数原型是否是一种不好的做法。我考虑使用一个静态方法来接收属性名称和要添加到原型中的函数来完成这个操作。
那么这样做是不好的做法吗?
function Test() {
    this.condition = false;
}

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

7
只有当你滥用它到难以跟踪的程度时(事实上,这通常是发生的情况),才需要这样做。就我个人而言,在编程中我更倾向于不要达到那种元编程的水平。 - Madara's Ghost
这是一种不好的做法,因为你的代码不能工作 :-) 它需要用 task 替换 this.task,并且应该缩短为 this.prototype[id] = task; - Bergi
我不确定,但我猜测.apply存在一些性能问题。 - Rajesh
@Rajesh 你有使用apply()函数遇到性能问题吗?这是从什么时候开始的呢?更何况,整个过程都假定动态修改原型,这会比使用Function.prototype.apply带来更大的性能影响... - Jared Smith
这种做法,按照你的呈现方式,是一个不好的想法:只是向原型添加随机方法,这些方法会即时修改由给定构造函数创建的每个现有对象。.apply 也不是必要的。一般来说,作为一个经验法则,继承是不好的。在源代码中无法直接看到的继承更糟糕。而原型继承仍然是继承。 - Jared Smith
1个回答

0
我认为在这种情况下这是一种不好的做法,因为您无法控制从类内部覆盖添加的[id]方法。
var test = new Test();
test.extend("example", function() {
    console.log("First Method");
});

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

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


好的,这个问题可以通过在添加新方法之前检查已添加到原型中的方法来解决。但是如果进行了这样的检查,使用这种方式扩展原型是否是一种不良实践? - javascripter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接