2015-01-26 5 views
5

Poniżej znajduje się fragment kodu z Crockforda w JavaScript: The Good Parts:Pośrednio dodać metod do prototypu konstruktora w JavaScript

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Crockforda idzie na wyjaśnić

„Poprzez rozszerzanie funkcji. prototyp z metodą metody, nie musimy już wpisywać nazwy prototypowej właściwości, ta część brzydoty może być teraz ukryta. "

Zasadniczo brakuje mi zrozumienia tego punktu. Co musieliśmy zrobić przed tym, co nie musimy już teraz robić?

+3

Dotykanie prototypu czegoś, czego nie jesteś właścicielem, to okropny pomysł (otwierasz drzwi do wszelkiego rodzaju konfliktów). Jest to zdumiewająco nierozważna odrobina lenistwa ze strony Crockforda. – ssube

+1

Wprowadzana tam "poprawa" nie ma tak naprawdę praktycznego znaczenia; Myślę, że to raczej przykład nauczania. – Pointy

+0

@ssube: Crockford "źle poinformowany"? Meh. jeśli to jest problem, pokaż nam, zamiast mówić nam ... – dandavis

Odpowiedz

9

On mówi, że zamiast pisać:

MyType.prototype.myMethod = function() { 
    .. 
}; 

można napisać tak:

MyType.method("myMethod", function() { 
    ... 
}); 

z możliwością (biorąc pod uwagę return this) z dot-łańcuchowym innego połączenia:

MyType.method("method1", function() { 
    ... 
}).method("method2", function() { 
    ... 
}); 

Meh.

2

Kod rozbić:

Function.prototype.method 

Każdy obiekt w JavaScript pozwala prototypy. To jest dziedziczenie JavaScript. Funkcją jest master object, z której tworzone są wszystkie inne funkcje. Po ustawieniu prototypu na nim wszystkie obiekty funkcji dziedziczą tę właściwość. W tym przypadku funkcja method.

Function.prototype.method= function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Jeśli chciał poszerzyć własne functions z innymi metodami trzeba wpisać:

somefunction.prototype.name = function(){} 

Dzięki tej metodzie można zrobić tylko to:

somefunction.method(name, function) 

Funky nieco robi to:

this.prototype[name] = func; 

Odnosi się do obiektu Function, używając słowa kluczowego this. Dochody z prototypu na dziedziczenie. Ustawia prototyp funkcji za pomocą [name]. To konwertuje nazwę ciągu do właściwości. Dlaczego tak? Ponieważ:

this.prototype.name 

nie działa poprawnie. Jeśli użyjesz powyższego kodu, za każdym razem, gdy zostanie dodany nowy method, zostanie on oznaczony przez name, a nie wybraną przez Ciebie nazwę.

Dlaczego prototype[example] to samo co prototype.example. Ponieważ w JavaScript każda właściwość jest przechowywana na liście w obiekcie i może być wywołana tak, jak wywołujesz element z tablicy za pomocą Object [].

1

Pozwala udowodnić oświadczenie corckford za:

„przez zwiększanie Function.prototype z metodą metody, nie longerhave wpisać nazwę właściwości prototyp trochę brzydoty mogą teraz. ukryć się."

Tutaj Crockforda chciał powiedzieć można manipulować Function.prototype osiągnąć wiele różnych funkcjonalności dla Twojego osobistego usage.It jest funkcjonalność dodana do function.prototype aby dodać nową metodę/nieruchomość do dowolnej funkcji .Funkcje w javascript dziedziczą formę Function.prototype.lets rozbijają twój kod.

Function.prototype.method = funkcja (nazwa, func) {

w tej linii Function.prototype dodaje nową metodę method.This otrzymać dwa argumenty. name satands dla nowej nazwy metody. I func oznacza jego funkcjonalność. Myślę, że jesteś obeznany z tym, jakie są metody i właściwości. Funkcje są obiektem pierwszej klasy w javascript.So można w nich dodawać nowe właściwości i metody.

this.prototype [nazwa] = func;

Tutaj to odnosi się do funkcji, która nazywa go. [name] jest nazwa metody i func jest funkcjonalność tejże metody Dodaje nową metodę funkcji przekazywane użyciu array notation. wreszcie

zwrot ten;

z tym stwierdzeniem funkcja przeszedł jest zwracany z nową metodę dodatkiem do niego.

Tutaj mam praktyczny przykład dla Ciebie:

Function.prototype.method = function (name, func) { 
this.prototype[name] = func; 
return this; 
}; 

function Myfunction(){  // a constructor function called Myfunction 
    this.name='robin';  // it has a name property 
} 

Myfunction.method('mymethod',function(){ console.log(' i am available')}); //adds a method named 'mymethod to Myfunction constructor 

var newObj=new Myfunction();  // creates a new instance of Myfunction class 
console.log(newObj.mymethod()); //calls mymethod() of newObj 

Tutaj myfunction jest constructor.We można dodać dziedziczone metody prototypu tego konstruktora usind Myfunction.prototype.mymethod=function(){ ..}

Jeśli używasz myfunction jako a Konstruktor to sposób w jaki dodajesz do niego metodę. Ale ponieważ dodałeś nową funkcjonalność do Funkcja.Prototyp, można po prostu nazwać jak

Myfunction.method('mymethod',function(){console.log('i am available'}); //it will add a method named mymethod to Myfunction's prototype 

tym stwierdzeniem doda nową metodę o nazwie mymethod do Myfunction()'s prototypeniejawnie.

więc nie nie napisać Myfunction.prototype.mymethod=function(){ console.log('i am available'); .Instead można napisać Myfunction.method('mymethod',function(){ console.log('i am available'});

Więc okazuje będzie zwalnia Cię od pisania Myfunction.prototype ponownie i ponownie za każdym razem chcesz dodać nowe metody Konstruktor Myfunction.

To potwierdza oświadczenie crockford: .

Powiązane problemy