2013-04-05 3 views
1

Я новичок в JS. Если я хочу назначить, например, 2 функции для контрструктора, нужно ли дважды вызывать объявление функции через прототип?JS несколько функций через прототип

function Shape(x, y) { 
    this.x= x; 
    this.y= y; 
} 



Shape.prototype.foo= function() { 

    return ...; 
}; 

Shape.prototype.bar= function() { 

    return ...; 
}; 
+1

* «Если я хочу назначить, например, 2 функции в виде застройщик» * I предположите, что вы хотите назначить функции свойству '' prototype' * конструктора. –

+0

Каков конечный результат, которого вы пытаетесь достичь? единственной причиной использования прототипа является попытка создания класса. в противном случае объект с методами будет более уместным. –

+0

@ Decker, я прочитал в потоке Stackoverflow, который присваивает функции конструктору не изящный, потому что каждый объект конструктора имеет собственную функцию, которая может быть фактически одной и той же для всех. Было бы избыточно создавать его для каждого объекта. – daisy

ответ

1

Вы можете сделать это таким образом, или вы можете назначить новый объект прототипа (перезапись любые существующие свойства/методы):

Shape.prototype = { 
    foo : function(){ 
    }, 
    bar : function(){ 
    } 
}; 

Если вы добавляете множество методов для различных прототипов, и вы не хотите, чтобы перезаписать весь объект-прототип, определить вспомогательный метод, чтобы сделать asignment для вас:

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

Лично я против этого, поскольку 'addToPrototype (Shape, {..})' длиннее, чем 'Shape.prototype', и делает его еще более запутанным для тех, кто смотрит ваш код, если вы делаете что-то вроде этого. – Niall

+0

@Niall - Я выбрал случайное имя, но это действительно просто способ использования mixins (например, http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/) , Позволяет добавлять методы к любому прототипу кратким способом без вытирания всего объекта. У многих библиотек есть что-то похожее, которое связано с цепочкой, но, вероятно, это сложнейший вопрос для этого вопроса. – Graham

2

Если я вас правильно понимаю, что-то, как это будет работать:

function Shape(x, y) { 
    this.x= x; 
    this.y= y; 
} 

Shape.prototype = { 
    constructor: Shape, 
    foo: function() { 
     return ...; 
    }, 
    bar: function() { 
     return ...; 
    } 
} 

http://jsfiddle.net/Yc4V4/

+1

Поскольку вы переписываете прототип Shape для полноты, вы должны включить 'constructor: Shape 'в объект перезаписи. – louisbros

+0

@louisbros Я получил править, предлагая это действительно, это было от вас на самом деле правильно? Это было отклонено модератором, пытаясь понять, почему, если бы это было без причины, я добавлю его в :) Не будет ли это вызывать неожиданную ошибку '}'? Подождите, не возражайте – Niall

+0

Не видите, почему это должно быть отклонено. 'console.log (новый Shape (1, 2) .constructor);' до и после перезаписи прототипа демонстрирует, почему. – louisbros

Смежные вопросы