2014-10-01 122 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可能会有所帮助。