|
Определение прототипа через объект
Обычно прототипы определяют так:
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. Конструкторы имеет смысл пользовать только для производительности. |
Цитата:
|
Часовой пояс GMT +3, время: 21:25. |
|