2014-10-01 14 views
13

Jak rozumiem, w JavaScript każdy obiekt ma prototype i ujawnia pewne domyślne właściwości. Mam następujący kod, w którym próbuję ustawić właściwość Year dwóch obiektów przez prototype. Ale oba połączenia zawodzą.Uzyskiwanie dostępu do prototypu obiektów JavaScript

Jak mogę przesłonić obiekt toLocalString() dla dowolnego obiektu, jeśli nie mam dostępu do prototype? Należy pamiętać, że poniższy kod służy do testowania właściwości prototype, ale moim zamiarem jest przesłonięcie metody toLocalString().

var car = { 
    Make: 'Nissan', 
    Model: 'Altima' 
}; 

car.Year = 2014; 
alert(car.Year); 

alert(car.prototype); // returns undefined 

car.prototype.Year = 2014; // Javascript error 

// -------------- 

function Car() { 
    this.Make = 'NISSAN'; 
    this.Model = 'Atlanta'; 
} 

var v = new Car(); 
v.prototype.Year = 2014; // JavaScript error 
alert(v.prototype); 
+1

W dolnej przykład, powinno być 'Car.prototype.Year = 2014' - ustawiasz prototyp na funkcji obiektu - nie utworzonej instancji. – tymeJV

+0

Masz na myśli 'toLocaleString()' zamiast 'toLocalString()' lub czy chcesz zaimplementować własną metodę 'toLocalString()'? – pasty

+0

Proszę spojrzeć na [tę odpowiedź] (http://stackoverflow.com/a/26149216/1841194) –

Odpowiedz

6

Masz dostęp do właściwości prototypu, ale jest ona dostępna tylko w przypadku Function s.

var car = { 
    Make: 'Nissan', 
    Model: 'Altima' 
}; 

To jest taka sama, jak:

var car = new Object(); 
car.Make = 'Nissan'; 
car.Model = 'Altima'; 

Więc car.__proto__ === Object.prototype.

I car.prototype === undefined jako właściwość prototype jest obecna tylko na Function s (jak już powiedziałem).

function Car() { 
    this.Make = 'NISSAN'; 
    this.Model = 'Atlanta'; 
} 

Tutaj Car.prototype punktów do instancji Object ponieważ Car jest funkcją i kiedy deklaracje funkcji są oceniane ich prototype jest ustawiony do instancji Object.

Car.prototype.Year = 2014; //all Car *instances* will have a Year property set to 2014 on their prototype chain. 

var c = new Car(); //create an instance 
console.log(c.Year); //2014 

Zastępowanie metody obecny na łańcuchu prototypów dla obiektu jest tak proste jak tworzenie odpowiedniego sposobu na obiekcie:

var myObject = new Object(); 
myObject.toLocaleString = function() { 
    //my own implementation 
}; 
5

Prawdopodobnie chcesz zmodyfikować prototyp funkcji konstruktora:

function Car(year, make, model) { 
    this.year = year; 
    this.make = make; 
    this.model = model; 
} 

Car.prototype.toLocaleString = function() { 
    return [this.year, this.make, this.model].join(' '); 
}; 

var civic = new Car(2014, 'Honda', 'Civic'); 
civic.toLocaleString(); // => "2014 Honda Civic" 

Ten MDN article on Object.prototype może być pomocne.

Powiązane problemy