Javascript 通过原型实现多个功能
我是JS的新手。如果我想将示例2的函数分配给构造函数,我是否必须通过原型调用函数声明两次Javascript 通过原型实现多个功能,javascript,function,prototype,Javascript,Function,Prototype,我是JS的新手。如果我想将示例2的函数分配给构造函数,我是否必须通过原型调用函数声明两次 function Shape(x, y) { this.x= x; this.y= y; } Shape.prototype.foo= function() { return ...; }; Shape.prototype.bar= function() { return ...; }; 如果我理解正确的话,像这样的事情会起作用: function Shape(
function Shape(x, y) {
this.x= x;
this.y= y;
}
Shape.prototype.foo= function() {
return ...;
};
Shape.prototype.bar= function() {
return ...;
};
如果我理解正确的话,像这样的事情会起作用:
function Shape(x, y) {
this.x= x;
this.y= y;
}
Shape.prototype = {
constructor: Shape,
foo: function() {
return ...;
},
bar: function() {
return ...;
}
}
您可以这样做,也可以将新对象指定给原型(覆盖任何现有属性/方法): 如果要向不同的原型添加许多方法,并且不希望覆盖整个原型对象,请定义一个帮助器方法来为您执行辅助操作:
function addToPrototype(constructor, obj){
for (var prop in obj){
constructor.prototype[prop] = obj[prop];
}
}
addToPrototype(Shape, {
foo : function(){
},
bar : function(){
}
});
addToPrototype(Shape, {
something : function(){
}
});
addToPrototype(Polygon, {
somethingElse : function(){
}
});
“如果我想将示例2的函数分配给构造函数”我猜您想将函数分配给构造函数的
prototype
属性。您试图实现的最终结果是什么?使用prototype的唯一原因是您试图创建一个类。否则,使用方法的对象更合适。@Decker,我在Stackoverflow线程中读到,将函数分配给构造函数并不优雅,因为构造函数的每个对象都有自己的函数,实际上所有对象都有相同的函数。为每个对象创建它将是冗余的。而不是构造函数中的构造函数。@kling这就是为什么你应该使用原型而不是在构造函数中编写函数:[这里是帖子]就个人而言,我反对这一点,因为addToPrototype(Shape,{..})
比形状长。prototype
如果你这样做,会让任何人看你的代码时更加困惑。@Niall-我随机选择了一个名称,但这实际上只是使用mixin(例如)的一种方式。允许您以简洁的方式向任何原型添加方法,而无需擦除整个对象。许多库都有类似的东西是可链接的,但对这个问题来说可能过于复杂了。因为你为了完整性而覆盖了形状原型,所以你应该在覆盖对象中包含constructor:Shape,
。@louisbros我得到一个编辑建议,确实是你写的,对吗?被一位版主拒绝了,他想知道为什么,如果没有原因,我会把它加进去:)这不会引发一个意外的}
错误吗?等等,我不明白为什么会被拒绝<代码>控制台.log(新形状(1,2).constructor)代码>在原型覆盖之前和之后演示了原因。我完全同意你的观点,这就是为什么我将其添加回,并且它在一行中通过函数实现了实际接受答案的功能。我只是很抱歉你没有拿到代表积分!
function addToPrototype(constructor, obj){
for (var prop in obj){
constructor.prototype[prop] = obj[prop];
}
}
addToPrototype(Shape, {
foo : function(){
},
bar : function(){
}
});
addToPrototype(Shape, {
something : function(){
}
});
addToPrototype(Polygon, {
somethingElse : function(){
}
});