Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.05.2015, 19:54
Интересующийся
Отправить личное сообщение для sexbot Посмотреть профиль Найти все сообщения от sexbot
 
Регистрация: 09.05.2015
Сообщений: 27

Что такого делает Object.create?
function Animal(name, sound) {
  this.name = name;
  this.sound = sound;
}

Animal.prototype.say = function() {
  console.log('%s says %s', this.name, this.sound);
};

function Cat() {
  Animal.call(this, "cat", "meow");
}

Cat.prototype = new Animal();
// Cat.prototype = Animal.prototype;
// Cat.prototype = Object.create(Animal.prototype);

var cat = new Cat();
cat.say(); // cat says meow

console.log(cat instanceof Cat); // true
console.log(cat instanceof Animal); // true
console.log(cat.constructor.name); // "Animal"?!


function inherit(Child, Parent) {
  Child.prototype = Object.create(Parent.prototype);
  Child.prototype.constructor = Child;
  Child.prototype.super = function() {
    Parent.apply(this, arguments);
  };
}

function Dog() {
  this.super("dog", "woof");
}

inherit(Dog, Animal);

var dog = new Dog;
dog.say();
console.log(dog.constructor.name);


Это код просто для примера. Мне непонятно почему при наследовании предпочтительнее делать `Child.prototype = Object.create(Parent.prototype)` вместо простого `Child.prototype = new Parent()`?
Ответить с цитированием
  #2 (permalink)  
Старый 15.05.2015, 20:59
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Сообщение от sexbot Посмотреть сообщение
Это код просто для примера. Мне непонятно почему при наследовании предпочтительнее делать `Child.prototype = Object.create(Parent.prototype)` вместо простого `Child.prototype = new Parent()`?
new Parent() - это создание нового объекта
Child.prototype = Object.create(Parent.prototype) - наследование методов

https://learn.javascript.ru/class-inheritance
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2015, 21:12
Интересующийся
Отправить личное сообщение для sexbot Посмотреть профиль Найти все сообщения от sexbot
 
Регистрация: 09.05.2015
Сообщений: 27

function inherit(Child, Parent) {
  Child.prototype = Object.create(Parent.prototype);
  Child.prototype.constructor = Child;
  Child.prototype.parent = Parent;
}

// `super` is reserved word
function sup(obj, method) {
  var args = Array.prototype.slice.call(arguments, 2)
  return obj.parent.prototype[method].apply(obj, args);
}

function Animal(name, sound) {
  this.name = name;
  this.sound = sound;
}

Animal.prototype.say = function() {
  console.log('%s says %s', this.name, this.sound);
};

function Cat() {
  this.counter = 0;
  this.parent.call(this, "cat", "meow");
}

inherit(Cat, Animal);

Cat.prototype.say = function(){
  sup(this, "say");
  console.log("method called %s times", ++this.counter);
};

var cat = new Cat();
cat.say();
cat.say();
cat.say();


Я еще магии немного принес, только вот что-то мне не нравится моя функция `sup`
Ответить с цитированием
  #4 (permalink)  
Старый 15.05.2015, 21:19
Интересующийся
Отправить личное сообщение для sexbot Посмотреть профиль Найти все сообщения от sexbot
 
Регистрация: 09.05.2015
Сообщений: 27

Профиксил:

function sup(o, meth) {
  var args = Array.prototype.slice.call(arguments, 2);
  var proto = Object.getPrototypeOf(Object.getPrototypeOf(o));
  return proto[meth].apply(o, args);
}
Ответить с цитированием
  #5 (permalink)  
Старый 15.05.2015, 21:29
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

new Parent() - создание экземпляра с выполнением конструктора Parent
Object.create(Parent.prototype) - создание экземпляра без выполнения конструктора Parent


function Ololo() {}
Ololo.prototype = Parent.prototype;
new Ololo() - тоже что делает Object.create
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 15.05.2015 в 21:31.
Ответить с цитированием
  #6 (permalink)  
Старый 15.05.2015, 21:39
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

забудьте уже эти велосипеды и просто используйте es6
http://babeljs.io/docs/learn-es6/#classes
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 15.05.2015, 21:44
Новичок на форуме
Посмотреть профиль Найти все сообщения от fuckJS
 
Регистрация: 15.05.2015
Сообщений: 8

Ваш код функционально примерно эквивалентен этому:
Animal={
 clone: function(name, sound){
  var o=Object.create(this)
  o.name=name; o.sound=sound
  return o
},
 say: function(){console.log(this.name+" says "+this.sound)}
}

Cat=Animal.clone("cat", "meow")
Dog=Animal.clone("dog", "woof")

Cat.say() //>>>> cat says meow
Dog.say() //>>>> dog says woof

Отсюда должно быть понятно, что он делает. Он создает новый объект, и ставит ему в прототип аргумент.
Ответить с цитированием
  #8 (permalink)  
Старый 15.05.2015, 21:50
Новичок на форуме
Посмотреть профиль Найти все сообщения от fuckJS
 
Регистрация: 15.05.2015
Сообщений: 8

Сообщение от devote
тоже что делает Object.create
строго говоря, не то же самое. Он помимо этого вешает кучу соплей а-ля Java
Ответить с цитированием
  #9 (permalink)  
Старый 15.05.2015, 23:00
Интересующийся
Отправить личное сообщение для sexbot Посмотреть профиль Найти все сообщения от sexbot
 
Регистрация: 09.05.2015
Сообщений: 27

А насчет такой функции что скажите?

function extendClass(Child, Parent) {
  var proto = Object.create(Parent.prototype);
  proto.constructor = Child;
  proto.superClass = Parent;
  proto.__super__ = Parent.prototype;

  // Как переименовать этот метод?
  proto.initialize = function () {
    this.superClass.apply(this, arguments);
  };

  // Как переименовать этот метод? С with работать не будет.
  // instance.super(method, arg1, arg2, ...)
  proto.super = function (method) {
    var args = Array.prototype.slice.call(arguments, 1);
    return this.__super__[method].apply(this, args);
  };

  extend(proto, Child.prototype);
  Child.prototype = proto;
}


extend:
function extend(target, source) {
  var names = Object.getOwnPropertyNames(source)
    , length = name.length;

  for (var i = 0; i < length; ++i) {
    var desc = Object.getOwnPropertyDescriptor(source, names[i]);
    Object.defineProperty(target, names[i], desc);
  }

  return target;
}


У меня проблемы с именованием переменных.
Ответить с цитированием
  #10 (permalink)  
Старый 16.05.2015, 00:45
Интересующийся
Отправить личное сообщение для sexbot Посмотреть профиль Найти все сообщения от sexbot
 
Регистрация: 09.05.2015
Сообщений: 27

function extend(target, source) {
  var names = Object.getOwnPropertyNames(source)
    , length = names.length;

  for (var i = 0; i < length; ++i) {
    var desc = Object.getOwnPropertyDescriptor(source, names[i]);
    Object.defineProperty(target, names[i], desc);
  }

  return target;
}

function inherit(Child, Parent) {
  var proto = Object.create(Parent.prototype);
  proto.constructor = Child;
  proto.parent = Parent.prototype;
  extend(proto, Child.prototype);
  Child.prototype = proto; 
}

function Animal(name, sound) {
  this.name = name;
  this.sound = sound;
}

Animal.prototype.say = function() {
  console.log("%s says %s", this.name, this.sound);
};

function Cat() {
  this.parent.constructor.call(this, "cat", "meow");
}

Cat.prototype.lick = function(what) {
  console.log("%s licking his %s", this.name, what);
};

inherit(Cat, Animal);

var cat = new Cat;
cat.say();
cat.lick("balls");
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смишных картинок тред megaupload Оффтопик 3447 03.07.2023 09:47
Что делает оператор % theYozh Общие вопросы Javascript 14 11.09.2016 08:13
Что делает этот скрипт? Wallkost Оффтопик 4 19.03.2010 14:54
что делает этот скрипт?)) jek Общие вопросы Javascript 5 10.01.2010 17:24
Браузер доказывает что не видит функцию SleepWalker Общие вопросы Javascript 7 17.06.2009 23:14