Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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_Function_Prototype - Fatal编程技术网

Javascript 通过原型实现多个功能

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(

我是JS的新手。如果我想将示例2的函数分配给构造函数,我是否必须通过原型调用函数声明两次

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(){
    }
});