Определение прототипа через объект
Обычно прототипы определяют так:
1. function Person() {} Person.prototype.name = "аноним"; Person.prototype.age = 18; А если определить прототип так: 2. function Person() {} Person.prototype = { name : "аноним", age : 18 }; Эти фрагменты эквивалентны или нет? |
Да, но возможно это скажется на производительности.
|
в изначальном prototype могут быть всякие полезности. например свойство constructor по которому можно пройтись по цепочке прототипов.
во втором случае его не будет. |
Цитата:
|
callbackhell,
Я вот тоже так думал, но: 1. function Person() {} var p1 = new Person(); Person.prototype.name = "Nicholas"; Person.prototype.age = 29; var p2 = new Person(); alert ( Person.prototype.isPrototypeOf(p1) ) ; alert ( Person.prototype.isPrototypeOf(p2) ) ; alert ( p1 instanceof Person ) ; alert ( p2 instanceof Person ) ; alert ( p1.constructor ) ; alert ( p2.constructor ) ; 2. function Person() {} var p1 = new Person(); Person.prototype = { name : "Nicholas", age : 29 }; var p2 = new Person(); alert ( Person.prototype.isPrototypeOf(p1) ) ; alert ( Person.prototype.isPrototypeOf(p2) ) ; alert ( p1 instanceof Person ) ; alert ( p2 instanceof Person ) ; alert ( p1.constructor ) ; alert ( p2.constructor ) ; дают разные результаты. В чём подвох - не пойму :( |
Цитата:
|
Цитата:
|
Цитата:
|
Вы к примеру, можете сделать вот так
MySuperClass = {type: "MySuperClass"} MyClass = Object.create(MySuperClass); MyClass.type = "MyClass" o1 = Object.create(MySuperClass) o2 = Object.create(MyClass) alert([o1.type, o2.type]) Это замена instanseOf. Когда вы освоитесь в прототипном программировании, вы удивитесь, насколько гибкие решения оно дает в плане ООП. А используя нативные конструкторы, а тем более es6-классы, вы опускаете язык до уровня какой-нибудь java. Конструкторы имеет смысл пользовать только для производительности. |
Цитата:
|
Keramet,
Особенно конструкторы будут Вам мешать при создании сабклассов. Тот пример котрый я привел, например, пишется с конструкторами через жопу и с кучей костылей. как-то так:) |
Цитата:
|
Keramet,
Еще раз повторяю, разрушить ничего нельзя, потому что ничего нет. Вы сами строите цепочки наследования. Это Ваша забота выстроить их так как нужно |
Стоп! "Чуть по-медленнее, я запиСУЮ.."
Конструкторы и прототипы придумали для того, чтобы реализовать наследование в ДжС, т.к. он (ДжС) не поддерживает классы. правильно? |
Цитата:
|
callbackhell,
меня учили, что ООП - это программирование, основными характеристиками которого является инкапсуляция, наследование и полиморфизм (я закончил ВУЗ лет 15 назад, может что-то изменилось:)) в классических ООП языках (джава, С++) для этих целей применяюстя классы. в ДжС классов нет, тут есть прототипы. правильно? |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Во втором - p1.__proto__ ссылается на предыдущий Person.prototype, который был заменен новым объектом уже после создания p1. И потому p1 более не считается экземпляром Person, с точки зрения прототипного ООП. Второй случай вполне допустим, только заменять Person.prototype надо сразу же при создании функции Person, до создания экземпляров. И не забыть туда свойство constructor поместить, о чем ранее говорилось. Тогда всё будет нормалёк. Ну а ежели какое наследование замутить изволите, то там особо без вариантов: Person.prototype = Object.create(ParentClass.prototype); и далее добавление методов по первой схеме. |
Цитата:
Вот что там действительно новое - "методы, привязанные к объектам". Штука в целом полезная и нужная. https://learn.javascript.ru/es-object#методы-объекта |
Цитата:
|
Цитата:
https://learn.javascript.ru/es-class...войства Цитата:
function createClass() { 'use strict'; class User { constructor(name) { this.name = name; } sayHi() { alert(this.name); } } return User; } function createObject(Class, param) { return new Class(param); } var User = createClass(); var user = createObject(User, "UserName123"); user.sayHi();есть так же Class Expression, в общем, всё как положено. Цитата:
|
Цитата:
В нормальных ЯП с этим проблем нет. Там Вы писали бы что то такое theTimeout = Timeout.create theTimeout.a = 1 object = { a: 10, fu1: staticFunction(){alert(a)}, fu2: dynamicFunction(){alert(a)} } theTimeout.addOnTimeout(object.fu1) theTimeout.addOnTimeout(object.fu2) //>>>1, 10 |
Цитата:
|
Цитата:
|
Яростный Меч,
Да, я наверное, плохо ознакомился, частично я не прав, тем не менее. Классы нельзя считать первоклассными сущностями уже потому, что их протокол отличается от объектного. В них нельзя иметь проперти. Насколько я подозревю, ими нельзя манипулировать с помощью Object.defineProperty, так? Они, вероятно, не поддерживают проксирование. Сабклассинг неуклюж, всегда надо забивать голову оверррайдами. Требуют строгого режима. Если там копнуть глубже, всплывет еще куча дерьма. Все равно при "классовом" подходе теряется гибкость. Я могу на коленке реализовать такие классы за пять минут, но могу и другие, с другой семантикой, ничего это не дает, по сути, просто еще один костыль. |
Яростный Меч,
Единственное ощутимое преимущество -- эт унификация кода в ынтырпрайзе. Но меня это не касается лично:) |
Цитата:
... method1: function(...) { ParentClass.prototype.method1.call(this, ...); }, ...вроде ничего страшного, но выглядит как-то не очень, и родительский класс напрямую упоминается, если менять, то по всему коду. есть ещё всякие реализации классов, там этих проблем нет, но реализовано через костыли. В новых классах всё просто: ... method1: function(...) { super.method1(...); }, ...и this передается как надо, и родительский класс не упоминается |
Цитата:
|
Цитата:
|
Цитата:
|
Я не часто на этом форуме бываю, но как я понял, здесь максимаксимус с самим собой дискутирует?
|
vasa_c,
Ты даже до его уровня не дорос, не обольщайся |
googlecallback, да я разве где-то пытался утверждать обратное? упаси осподи.
Я просто поинтересовался, чтобы случайно не вляпаться. |
Цитата:
|
Часовой пояс GMT +3, время: 13:15. |