访问Javascript对象原型

时间:2014-10-01 19:47:47

标签: javascript prototype javascript-objects

据我所知,在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);

2 个答案:

答案 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可能会有所帮助。

相关问题