2014-12-16 2 views
0

Я хотел бы присвоить свойство прототипу функции и использовать это свойство до установки прототипа в качестве прототипа функции (трудно объяснить). Если бы я делал это на Java, я бы просто создал публичную статическую конечную переменную в базовом классе. Например ...Использование свойств прототипа перед прототипом функции установлено

function Foo(a, b) { 
    this.a = a; 
    this.b = b; 
} 

function Bar() { 
    this.prototype.A = 100; 
    this.prototype.B = 250; 
    Foo.call(this, this.prototype.A, this.prototype.B); 
} 
Bar.prototype = Object.create(Foo); // Bar.A and Bar.B are now undefined, not what I 
            // want to happen. 

Потенциальная реализация # 1 ...

function Foo(a, b) { 
    this.a = a; 
    this.b = b; 
} 

var tempA = 100; 
var tempB = 250; 

function Bar() { 
    Foo.call(this, tempA, tempB); 
} 
Bar.prototype = Object.create(Foo); 
Bar.prototype.A = tempA; 
Bar.prototype.B = tempB; 

Потенциальная реализация # 2 ...

function Foo(a, b) { 
    this.a = a; 
    this.b = b; 
} 

var barPrototype = Object.create(Foo); 
barPrototype.A = 100; 
barPrototype.B = 250; 

function Bar() { 
    Foo.call(this, barPrototype.A, barPrototype.B); 
} 
Bar.prototype = barPrototype; 

Кто-нибудь есть предпочтения в отношении которых реализация лучше? Или есть более элегантный способ (без временных переменных) для этого?

+1

Что вы пытаетесь достичь? Почему бы просто не превратить 'A' и' B 'частные переменные в конструктор' Bar', и почему бы вам просто не вызвать Foo напрямую с этими переменными? –

+0

В основном я пытаюсь создать константы 'A' и' B' для панели функций. Я хочу иметь возможность проверять значение 'A' и' B' внешне. – hendryau

ответ

1

Вы просто хотите расширить прототип Foo и добавить к нему дополнительные атрибуты? Для этого вы можете использовать что-то вроде этого:

function Bar() { 
    new Foo.call(this, this.A, this.B); // It's a constructor, should use new 
} 

var proto = Object.create(Foo.prototype); 
proto.A = 100; 
proto.B = 250; 

Bar.prototype = proto; 

Однако, если вы хотите продлить это дальше, то вы действительно ищете Mixin метод, который позволит вам объединить два объекта вместе. Если вы уже используете JQuery (примечание: определенно не защищаю только для этой цели), вы можете использовать метод $.extend():

Bar.prototype = $.extend({}, Foo.prototype, { 
    A: 100, 
    B: 250 
}); 

Если вы не используете JQuery, это не должно быть трудно найти подобный метод в другом месте (например, Подчеркивание имеет один тоже)


Если вы хотите иметь совместно переменную, чтобы быть доступными для обоих Foo и Bar, в п можно альтернативно обернуть их определения в Immediately-Invoking Function Expression (IIFE) и определите А и В приватных переменных в этой функции:

(function() { 
    var A = 100, 
     B = 250; 

    function Foo() { ... } 

    function Bar() { 
    Foo.call(this, A, B); 
    } 
})(); 

Это было бы более уместно, если А и В являются более глобальными константами, а не по своей природе связаны с Баром.

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