2012-03-28 2 views
0

Так что я смотрю на некоторый код из «красноречивого Javascript», и он говорит, что причина наследования вы можете написать функцию, как:Для копирования прототипов требуется новый объект? Javascript

function clone(object) { 
    function OneShotConstructor() {} 
    OneShotConstructor.prototype = object; 
    return new OneShotConstructor(); 
} 

и назвали бы это как так, если класс Terrarium уже определены:

function LifeLikeTerrarium(plan) { 
    Terrarium.call(this, plan); 
} 
LifeLikeTerrarium.prototype = clone(Terrarium.prototype); 
LifeLikeTerrarium.prototype.constructor; 

Так что мой вопрос, почему мы должны создать OneShotConstructor для того, чтобы скопировать его прототип. Почему бы нам просто не написали что-то вроде:

LifeLikeTerrarium.prototype = new Terrarium(); 

Будет ли это создавать какие-либо проблемы, является некорректным JavaScript? прототипичное наследование

+0

Я также нашел аналогичную интерпретацию здесь: http://pivotallabs.com/users/pjaros/blog/articles/1368-javascript-constructors-prototypes-and-the-new-keyword под «И для моего последнего трюка. " Здесь метод называется create, и, по-видимому, причина в том, что нам не нужно указывать параметры для конструктора, но почему clone/create вызывает нас вокруг проблемы необходимости предоставления параметров конструктора? – jrbalsano

ответ

2

знакомства Крокфорда в:

http://javascript.crockford.com/prototypal.html

за установки прототипа, вам нужно вызвать новое ключевое слово, которое устанавливает внутренний [[Prototype]] объект недвижимости, чтобы быть внешним прототипом функции конструктора. Затем он выполняет функцию конструктора, используя новый объект всякий раз, когда это упоминается ..

Приятное объяснение здесь:

What is the 'new' keyword in JavaScript?

и здесь:

http://joost.zeekat.nl/constructors-considered-mildly-confusing.html

+0

Спасибо. Эти ссылки очень помогли! Я не знаю, просверлил ли мой Java OOP в мою голову или просто характер прототипного программирования, который действительно бросал меня на цикл, но потребовалось некоторое время, чтобы, наконец, собрать все это. – jrbalsano

1

Итак, мой вопрос в том, почему нам нужно создать OneShotConstructor в заказать копию своего прототипа. Почему бы нам просто не написали что-то вроде:

LifeLikeTerrarium.prototype = new Terrarium(); 

Будет ли это создавать какие-либо проблемы, является некорректным JavaScript?

Поскольку вызов нового Terrarium() будет, помимо клонирования объекта, вызвать его конструктор, который имеет неизвестные последствия. Если вы сделаете это круговым способом, вы клонируете объект, не вызывая конструктор.

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