2014-10-01 152 views
13

據我所知,在JavaScript中,每個對象都有一個prototype,它公開了一些默認屬性。我有以下代碼,我試圖通過prototype設置兩個對象的Year屬性。但是這兩個電話都失敗了。訪問Javascript對象原型

如果我無法訪問prototype,我如何覆蓋toLocalString()的任何對象?請注意,以下代碼將在prototype屬性上進行測試,但我的意圖是覆蓋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

在你的底部例如,它應該是'Car.prototype.Year = 2014' - 你在對象函數上設置原型 - 不是創建的實例。 – tymeJV 2014-10-01 19:49:32

+0

你的意思是'toLocaleString()'而不是'toLocalString()'或者你想實現你自己的'toLocalString()'方法嗎? – pasty 2014-10-01 20:02:56

+0

請看看[這個答案](http://stackoverflow.com/a/26149216/1841194) – 2014-10-01 20:07:53

回答

6

您確實有權訪問原型屬性,但它僅存在於Function s。

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

這是一樣的:

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

所以,car.__proto__ === Object.prototype

car.prototype === undefined作爲prototype財產只存在於Function s(正如我已經說過的)。

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

這裏Car.prototype指向的Object因爲Car一個實例是一個函數,當函數聲明進行評估他們的prototype設置爲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 

重寫存在於原型鏈的對象的方法與創建對象上的相應的方法簡單:

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

你可能想修改構造函數原型:

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" 

MDN article on Object.prototype可能會有所幫助。