Back to site

Прототипных спадчыну ў JavaScript

Пяць гадоў таму я напісаў Класічная спадчыну ў JavaScript (Кітайскі Італьянская Японская). Яно паказала, што JavaScript з'яўляецца клас вольны, прототипных мове, і што ён мае досыць выразная сіла для імітацыі класічнай сістэмы. Мой стыль праграмавання ператварылася з тых часоў, як любы добры праграміст павінен. Я навучыўся цалкам прыняць prototypalism, і вызвалілі сябе ад межы класічнай мадэлі.

Мой шлях быў абыходныя паколькі JavaScript само супярэчнасць аб яго прототипных прыроды. У прототипных сістэмы, аб'екты ўспадкуюць ад аб'ектаў. JavaScript, аднак, не хапае аператар, які выконвае гэтую аперацыю. Замест гэтага ён new аператар, такі, што

new F ()

выпускае новы аб'ект, які ў спадчыну ад

F .prototype

Гэта ўскосна была прызначана, каб зрабіць мову здаецца больш знаёмыя класічна навучаных праграмістаў, але не змог зрабіць гэта, як мы бачым з вельмі нізкага меркавання Java праграмісты з JavaScript. Канструктар карціна мовы JavaScript не звярнуцца да класічнай натоўпу. Ён таксама Obscured сапраўднай прыроды прототипных JavaScript. Як вынік, Ёсць вельмі мала праграмістаў, якія ведаюць, як выкарыстоўваць мову эфектыўна.

На шчасце, гэта лёгка стварыць аператара, які рэалізуе сапраўднае прототипных спадчыну. Гэта стандартная функцыя ў маім інструментарый, і я настойліва рэкамендую яго для вашага.

    function object(o) {
        function F() {}
        F.prototype = o;
        return new F();
    }

object функцыі разблытвае канструктар шаблон JavaScript's, дасягненні сапраўднага прототипных спадчыну. Ён прымае стары аб'ект у якасці параметра і вяртае пусты новы аб'ект, які ў спадчыну ад старой. Калі мы паспрабуем атрымаць члена ад новага аб'екта, і ёй не хапае, што ключ, то стары аб'ект будзе пастаўляць членаў. Аб'екты ўспадкуюць ад аб'ектаў. Што можа быць больш аб'ектна-арыентаваным, чым гэта?

Такім чынам, замест стварэння класаў, вы робіце прататып аб'ектаў, а затым выкарыстоўваць object функцыі, каб зрабіць новыя асобнікі. Аб'екты змяняныя ў JavaScript, таму мы можам павялічыць новых асобнікаў, даючы ім новыя палі і метады. Яны могуць выступаць у якасці прататыпаў для яшчэ больш новых аб'ектаў. Нам не патрэбныя класы зрабіць шмат падобных аб'ектаў.

Для зручнасці, мы можам стварыць функцыі, якія будзем называць object функцыі для нас, а таксама аказваць іншыя наладкі, такія як павелічэння новых аб'ектаў з прывілеяваным функцый. Часам я называю гэтыя мейкера. Калі ў нас ёсць Стваральнік, што функцыя выклікае іншую функцыю стваральніка замест выкліку object функцыя, то мы паразітарныя парадак атрымання ў спадчыну.

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

Вывучэнне гэтых новых мадэляў таксама зрабіў мяне лепш класічнага праграміста. Погляд знутры дынамічным свеце можа быць ужыты ў статычныя.

2006-06-07

Here is another formulation:

Object.prototype.begetObject = function () {
    function F() {}
    F.prototype = this;
    return new F();
};

newObject = oldObject.begetObject();

2007-04-02

 

Праблема з object функцыі з'яўляецца тое, што яна носіць глабальны характар, і з глабальнымі відавочна праблематычна. Праблема з Object.prototype.begetObject з'яўляецца тое, што да паездкі некампетэнтных праграм, і гэта можа прывесці да непрадказальных вынікаў, калі begetObject перавызначаць.

Так што я цяпер аддаюць перавагу такой фармулёўцы:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}
newObject = Object.create(oldObject);
Popular Links
Published (Last edited): Apr 7 , source: http://javascript.crockford.com/prototypal.html