|
Определение прототипа через объект
Обычно прототипы определяют так:
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, время: 15:11. |
|