2013-02-15 2 views
1

Можно комбинировать следующиеКомбинирование JavaScript стили прототипа

function something() {} 
function somethingElse() {} 

somethingElse.prototype = new something(); 
somethingElse.prototype.someFunction = function() {} 
... 

с этим

somethingElse.prototype = { 
    someFunction: function() {}, 
    ... 
} 

и поддерживать прототип наследованием цепь

Это чисто косметический я думаю. Я просто хотел бы определить все функции внутри {}, а затем использовать огромное количество ... prototype ... = ...

Я тоже много видел, но никогда их не собирали.

+0

Вы пробовали? – Shmiddty

+0

Я пробовал различные вещи, такие как установка __proto__ afterward и т. Д. __proto__ был довольно напуганным. – 0xFADE

ответ

1

Мой личный любимый подход - захватить библиотеку underscore.js. У этого есть действительно хороший метод, названный расширением, чтобы привязать свойства к объектам. Таким образом, я могу сделать:

function something() {} 
function somethingElse() {} 

somethingElse.prototype = new something(); 

_.extend(somethingElse.prototype, { 
    someFunction: function() { }, 
    someOtherFunction: function() { } 
}); 
+0

Мне нужно пойти с этим. Это не решение, которое я действительно искал, но он это делает. Глядя в источник подчеркивания, вы просто копируете все объекты, которые вы проходите. Так что это звучит довольно медленно. – 0xFADE

0

Разница в том, что во второй версии somethingElse экземпляры не наследуют ничего от something и его прототипную цепочку. Однако, учитывая ваш пример кода, это не имеет никакого значения.

+2

Важно, если 'instanceof' важен. – Shmiddty

+0

В этом весь смысл. Вторая часть не может наследовать действие цепочки наследования. Расширение Криса выполнит эту работу. Я надеялся на то, что не нужно было включать. – 0xFADE

+0

@ 0xFADE По-видимому, я пропустил ваше предложение «и поддерживаю цепочку прототипов-наследований» ... – bfavaretto

0

Ну, они совершенно одинаковы.

foo = {} 
foo.bar = baz 

такая же, как

foo = { 
    bar: baz 
} 

Это дело вкуса.

BTW: считается, что стиль лучше назвать конструкторами (все, что нужно назвать новым) с начальным капиталом, чтобы отличать его от обычных функций, потому что сбивать с толку они могут очень плохо.

0

Вы можете использовать Object.defineProperties, но на самом деле это более многословным, и не имеет поддержки в старых браузерах:

Object.defineProperties(somethingElse.prototype,{ 
    someOtherFunction: { 
     value:function() {...} 
    }, 
    ... 
}); 

В качестве альтернативы, можно добавить элементарную extend метод прототипу объекта:

Object.prototype.extend = function(obj){ 
    for(var p in obj)this[p] = obj[p]; 
}; 

, который позволит вам сделать это:

somethingElse.prototype.extend({ 
    A:function(){'a'}, 
    B:function(){'b'} 
}); 

Я бы рекомендовал против этого, так как модификация прототипов нативных объектов может стать рискованным.

+0

Спасибо. Интересно, возможно ли противоположное. Вместо того, чтобы делать все это для копирования объектов, есть способ точно установить прототип при его создании. obj.prototype = { ... _something_that_defines_the_prototype: new something() } – 0xFADE