访问Javascript对象原型

won*_*rld 16 javascript prototype javascript-objects

据我所知,在JavaScript中,每个对象都有一个prototype,它暴露了一些默认属性.我有以下代码,我试图通过设置两个对象的Year属性prototype.但这两个电话都失败了.

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);
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 8

您可以访问prototype属性,但它只出现在Functions上.

var car = {
    Make: 'Nissan',
    Model: 'Altima'
}; 
Run Code Online (Sandbox Code Playgroud)

这与:

var car = new Object();
car.Make = 'Nissan';
car.Model = 'Altima'; 
Run Code Online (Sandbox Code Playgroud)

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

car.prototype === undefined作为prototype属性只存在于FunctionS(正如我已经说过).

function Car() {
    this.Make = 'NISSAN';
    this.Model = 'Atlanta';
}
Run Code Online (Sandbox Code Playgroud)

这里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
Run Code Online (Sandbox Code Playgroud)

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

var myObject = new Object();
myObject.toLocaleString = function() {
  //my own implementation
};
Run Code Online (Sandbox Code Playgroud)


mae*_*ics 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"
Run Code Online (Sandbox Code Playgroud)

这篇MDN文章Object.prototype可能会有所帮助.