访问Javascript对象原型

Accessing Javascript object prototype

本问题已经有最佳答案,请猛点这里访问。

据我所知,在javascript中,每个对象都有一个prototype,它公开了一些默认属性。我有下面的代码,尝试通过prototype设置两个对象的Year属性。但这两个电话都失败了。

如果我没有访问prototype的权限,如何为任何对象覆盖toLocalString()?请注意,以下代码是为了测试prototype属性,但我的目的是重写toLocalString()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);


您确实可以访问原型属性,但它只存在于Function上。

1
2
3
4
var car = {
    Make: 'Nissan',
    Model: 'Altima'
};

这与:

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

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

car.prototype === undefined作为prototype财产只存在于Function上(如我之前所说)。

1
2
3
4
function Car() {
    this.Make = 'NISSAN';
    this.Model = 'Atlanta';
}

这里,Car.prototype指的是Object的一个实例,因为Car是一个函数,当函数声明被评估时,它们的prototype被设置为Object的一个实例。

4

覆盖对象原型链上的方法与在对象上创建相应的方法一样简单:

1
2
3
4
var myObject = new Object();
myObject.toLocaleString = function() {
  //my own implementation
};

您可能希望修改构造函数函数原型:

1
2
3
4
5
6
7
8
9
10
11
12
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"

这篇关于Object.prototype的MDN文章可能会有所帮助。