ўспадкоўванне прататыпа

Маючы бацькоўскі клас :

function Animal() {
 //do something
}

Animal.prototype.walk = function() {
  alert('I am walking.');
};

і дзіця <�ет> клас :

function Lion() {
 //do something
}

калі я хачу Lion ўспадкаваць Animal 's прататып звычайная практыка заключаецца ў наступным:

Lion.prototype = new Animal();

// Set the constructor to Lion, because now it points to Animal
Lion.prototype.constructor = Lion;

<�Моцны> Ці з'яўляецца гэта якім-небудзь чынам адрозніваецца ад гэтага (як вынік не як прадукцыйнасць)?

$.extend(Lion.prototype, Animal.prototype);

Для ня распрацоўшчыкаў jQuery :. $ пашыраюць капіюе ўсе метады прататыпа і атрыбуты, па адным з жывёл у Lion.

Я не вялікі спецыяліст атрымання ў спадчыну ў JavaScript. Я звычайна выкарыстоўваю фреймворк для распрацоўкі франтальнай, дзе ўсё проста працуе, але цяпер я хацеў бы таксама зразумець, як спадчыну прататыпаў работ.

NOTE! I read many articles about the subject, I know there are many "plugins" that implements the Class functionality. This is not what I need. Please answer the question, not just link articles about the subject (except if that answers it).

Дзякуй!

3
. <�Код> $ распасцірацца у jQuery рэалізуе падмяшаць JavaScript шаблон прызначаны ў першую чаргу для кланавання аб'ектаў і дадаваць новыя рэквізіту і метады; дзе змены ранейшага аб'екта не ўплывае на новую. Думайце пра гэта як новы Object.create у гармоніі, але з адным адрозненнем - newObj = Object.create (oldObj) робіць oldObj у <�код > __ прота __ з newObj
дададзена аўтар Om Shankar, крыніца

10 адказы

Там розніца, капіявання уласцівасцяў паміж двума прататыпамі, не робіць іх «звязаныя» адзін з адным, т.е.:

$.extend(Lion.prototype, Animal.prototype);

// add one more method to the prototype
Animal.prototype.test = function() {
  alert('test');
};

var x = new Lion();
x.test();//TypeError: Object  has no method 'test'

Вы б не гэта, калі вы выкарыстоўваеце новы Animal() у якасці прататыпа для Lion , як было прадэманстравана .

3
дададзена

Там розніца, капіявання уласцівасцяў паміж двума прататыпамі, не робіць іх «звязаныя» адзін з адным, т.е.:

$.extend(Lion.prototype, Animal.prototype);

// add one more method to the prototype
Animal.prototype.test = function() {
  alert('test');
};

var x = new Lion();
x.test();//TypeError: Object  has no method 'test'

Вы б не гэта, калі вы выкарыстоўваеце новы Animal() у якасці прататыпа для Lion , як было прадэманстравана .

3
дададзена

Нядаўна я напісаў артыкул, якая тлумачыць Чаму прататып Успадкоўванне Пытанні . Гэта крыху доўга, але добра варта чытаць.

Каб адказаць на ваша пытанне прама, ды Lion.prototype = новы Animal адрозніваецца ад $ распасцірацца (Lion.prototype, Animal.prototype) таму .:

  1. У першым выпадку вы карыстаецеся дэлегацыі .
  2. У другім выпадку вы карыстаецеся канкатэнацыі .

Пост я звязаны вам тлумачыць сапраўднае прататып ўспадкоўванне (г.зн. прататып спадчыну, выкарыстоўваючы прататып малюнак).

Гэта што Ваш кліент будзе выглядаць, калі вы выкарыстоўвалі сапраўднае прататып спадчыну ў JavaScript:

var animal = {
    create: function() {
        return this.extend();
    },
    walk: function() {
        alert("I am walking.");
    }
};

var lion = animal.extend({
    create: function() {
        return animal.create.call(this);
    }
});

Тут падоўжыць з'яўляецца адзін з паста я звязаны вам.

Параўнайце гэта з вашым кодам, які выкарыстоўвае шаблон канструктара для прототипного ў спадчыну.

Here's a fiddle which shows true prototypal inheritance in action: http://jsfiddle.net/6x4BU/

3
дададзена
Добры артыкул (хоць я не падзяляю ўсе вашы думкі). Прынамсі, пакласці пералічваюцца ўласцівасці на Object.prototype дрэнная практыка! І тая Клоны масівы прадухіліць вываз смецця.
дададзена аўтар Bergi, крыніца
@Bergi - Гэта добрае назіранне. Я паспрабую знайсці рашэнне гэтага. Дзякуй.
дададзена аўтар Aadit M Shah, крыніца
@Bergi - Вы не маглі б размясціць адзін і той жа каментар на маім блогу, каб іншыя маглі прачытаць яго.
дададзена аўтар Aadit M Shah, крыніца

Нядаўна я напісаў артыкул, якая тлумачыць Чаму прататып Успадкоўванне Пытанні . Гэта крыху доўга, але добра варта чытаць.

Каб адказаць на ваша пытанне прама, ды Lion.prototype = новы Animal адрозніваецца ад $ распасцірацца (Lion.prototype, Animal.prototype) таму .:

  1. У першым выпадку вы карыстаецеся дэлегацыі .
  2. У другім выпадку вы карыстаецеся канкатэнацыі .

Пост я звязаны вам тлумачыць сапраўднае прататып ўспадкоўванне (г.зн. прататып спадчыну, выкарыстоўваючы прататып малюнак).

Гэта што Ваш кліент будзе выглядаць, калі вы выкарыстоўвалі сапраўднае прататып спадчыну ў JavaScript:

var animal = {
    create: function() {
        return this.extend();
    },
    walk: function() {
        alert("I am walking.");
    }
};

var lion = animal.extend({
    create: function() {
        return animal.create.call(this);
    }
});

Тут падоўжыць з'яўляецца адзін з паста я звязаны вам.

Параўнайце гэта з вашым кодам, які выкарыстоўвае шаблон канструктара для прототипного ў спадчыну.

Here's a fiddle which shows true prototypal inheritance in action: http://jsfiddle.net/6x4BU/

3
дададзена
Добры артыкул (хоць я не падзяляю ўсе вашы думкі). Прынамсі, пакласці пералічваюцца ўласцівасці на Object.prototype дрэнная практыка! І тая Клоны масівы прадухіліць вываз смецця.
дададзена аўтар Bergi, крыніца
@Bergi - Гэта добрае назіранне. Я паспрабую знайсці рашэнне гэтага. Дзякуй.
дададзена аўтар Aadit M Shah, крыніца
@Bergi - Вы не маглі б размясціць адзін і той жа каментар на маім блогу, каб іншыя маглі прачытаць яго.
дададзена аўтар Aadit M Shah, крыніца

Не, яны не тое ж самае.

Першы прыклад прататып Lion становіцца <�моцны> асобнік пра жывёл. Гэты асобнік мае успадкаваць ад жывёлы прататыпа і будзе спасылка на гэты прататып. Калі жывёла прататып мадыфікуецца асобнік будзе закрануты.

Другі прыклад проста <�моцны> скапіяваць ўласцівасці ад жывёл прататыпа і Lion не будзе звязаны з фактычнымі жывёламі самага прататыпа.

1
дададзена

Не, яны не тое ж самае.

Першы прыклад прататып Lion становіцца <�моцны> асобнік пра жывёл. Гэты асобнік мае успадкаваць ад жывёлы прататыпа і будзе спасылка на гэты прататып. Калі жывёла прататып мадыфікуецца асобнік будзе закрануты.

Другі прыклад проста <�моцны> скапіяваць ўласцівасці ад жывёл прататыпа і Lion не будзе звязаны з фактычнымі жывёламі самага прататыпа.

1
дададзена

Як і іншыя ўжо казаў, так, ёсць розніца.

У першым прыкладзе, змены ў прататып жывёл зменяць паводзіны асобнікаў Lion.

У другім прыкладзе, Леў спадчыну магчымасці жывёл <�моцных> у момант $ .extend() выкліку.

Першы спосаб мае некаторыя, магчыма, шкодныя пабочныя эфекты, хоць, у прыватнасці:

  • Змена ў жывёл можа рабізна, і зламаць Леў і яго нашчадкаў. Гэтая дынаміка змены ўласцівасць дэлегаваных прататыпаў звычайна лічыцца добрай рэччу, але калі ён ужываецца да ўспадкоўванні шматузроўневага, ён часта выклікае праблемы.

  • <�Літый> <�р> Першы спосаб не дазваляе <�моцны> выбарчае ўспадкоўванне </моцны> ад жывёлы. Гэта ўсё або нічога. Вы хацелі банан, але тое, што вы атрымалі, былі гарылаю, банан, і ўсе джунглі. (Гэтая вядомая праблема называецца/праблемы банан гарылы). Апошні метад дазваляе выбарачна спадчыну ад жывёл: $ распасцірацца (Lion.prototype, {запусціць: Animal.prototype.run, сон: Animal.prototype.sleep}) ;.
  • InstanceOf парывае з канкатэнацыі - але InstanceOf не з'яўляецца надзейным ў любым выпадку. Калі вы перапрызначыць прататып жывёл, ён зламаецца. Калі вы спрабуеце выкарыстоўваць яго праз кантэксты, яна ламаецца. Іншымі словамі, <�моцны> не выкарыстоўваць InstanceOf , незалежна ад таго, які метад атрымання ў спадчыну вы выбіраеце.

Канструктары не патрэбныя наогул. Вы можаце проста стварыць аб'ект літаральнага пад назвай жывёльнага і зрабіць гэта:

lion = Object.create(animal);

Яшчэ лепш, калі пакласці, што ў функцыі фабрыкі:

function lion(options) {
  return $.extend(Object.create(lion), options);
}

Factory functions have lots of advantages over constructor that I won't go into here. You can see more details in my answer on this post: Constructor function vs Factory functions

0
дададзена

Як і іншыя ўжо казаў, так, ёсць розніца.

У першым прыкладзе, змены ў прататып жывёл зменяць паводзіны асобнікаў Lion.

У другім прыкладзе, Леў спадчыну магчымасці жывёл <�моцных> у момант $ .extend() выкліку.

Першы спосаб мае некаторыя, магчыма, шкодныя пабочныя эфекты, хоць, у прыватнасці:

  • Змена ў жывёл можа рабізна, і зламаць Леў і яго нашчадкаў. Гэтая дынаміка змены ўласцівасць дэлегаваных прататыпаў звычайна лічыцца добрай рэччу, але калі ён ужываецца да ўспадкоўванні шматузроўневага, ён часта выклікае праблемы.

  • <�Літый> <�р> Першы спосаб не дазваляе <�моцны> выбарчае ўспадкоўванне </моцны> ад жывёлы. Гэта ўсё або нічога. Вы хацелі банан, але тое, што вы атрымалі, былі гарылаю, банан, і ўсе джунглі. (Гэтая вядомая праблема называецца/праблемы банан гарылы). Апошні метад дазваляе выбарачна спадчыну ад жывёл: $ распасцірацца (Lion.prototype, {запусціць: Animal.prototype.run, сон: Animal.prototype.sleep}) ;.
  • InstanceOf парывае з канкатэнацыі - але InstanceOf не з'яўляецца надзейным ў любым выпадку. Калі вы перапрызначыць прататып жывёл, ён зламаецца. Калі вы спрабуеце выкарыстоўваць яго праз кантэксты, яна ламаецца. Іншымі словамі, <�моцны> не выкарыстоўваць InstanceOf , незалежна ад таго, які метад атрымання ў спадчыну вы выбіраеце.

Канструктары не патрэбныя наогул. Вы можаце проста стварыць аб'ект літаральнага пад назвай жывёльнага і зрабіць гэта:

lion = Object.create(animal);

Яшчэ лепш, калі пакласці, што ў функцыі фабрыкі:

function lion(options) {
  return $.extend(Object.create(lion), options);
}

Factory functions have lots of advantages over constructor that I won't go into here. You can see more details in my answer on this post: Constructor function vs Factory functions

0
дададзена

Гэта базавы прататып спадчыну ў чыстым JavaScript

// base class declaration
function Animal (arg) {
    this.arg = arg;
}

// just a method in the Animal class, it can be whatever you want
Animal.prototype.roar = function() {
    alert(this.arg);
};

// object that inherits the base class
function Lion (arg) {
   //the call to the super constructor
    Animal.call(this, arg);
}

// the prototypical inheritance
Lion.prototype = Object.create(Animal.prototype);
// the constructor needs to be set so that it does not show as the base constructor
// otherwise the constructor for all instances of Lion will show as Animal
Lion.prototype.constructor = Lion;

var symba = new Lion('the lion is roaring');

symba.roar();
0
дададзена

Гэта базавы прататып спадчыну ў чыстым JavaScript

// base class declaration
function Animal (arg) {
    this.arg = arg;
}

// just a method in the Animal class, it can be whatever you want
Animal.prototype.roar = function() {
    alert(this.arg);
};

// object that inherits the base class
function Lion (arg) {
   //the call to the super constructor
    Animal.call(this, arg);
}

// the prototypical inheritance
Lion.prototype = Object.create(Animal.prototype);
// the constructor needs to be set so that it does not show as the base constructor
// otherwise the constructor for all instances of Lion will show as Animal
Lion.prototype.constructor = Lion;

var symba = new Lion('the lion is roaring');

symba.roar();
0
дададзена