据我所知,在JavaScript中,每个对象都有一个prototype
,它会公开一些默认属性。我有以下代码,我试图通过prototype
设置两个对象的Year属性。但这两个电话都失败了。
如果我无权访问toLocalString()
,如何覆盖任何对象的prototype
?请注意,以下代码用于测试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);
答案 0 :(得分:8)
您可以访问prototype属性,但它只出现在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
上(正如我已经说过的那样)。
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
};
答案 1 :(得分:6)
您可能想要修改构造函数原型:
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
可能会有所帮助。