访问 Javascript 对象原型 [重复]

Posted

技术标签:

【中文标题】访问 Javascript 对象原型 [重复]【英文标题】:Accessing Javascript object prototype [duplicate] 【发布时间】:2014-11-26 18:22:44 【问题描述】:

据我了解,在 javascript 中,每个对象都有一个 prototype,并且它公开了一些默认属性。我有以下代码,我试图通过prototype 设置两个对象的 Year 属性。但是两个调用都失败了。

如果我无权访问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);

【问题讨论】:

在你的底部示例中,它应该是Car.prototype.Year = 2014 - 你在对象函数上设置原型 - 而不是创建的实例。 你的意思是toLocaleString()而不是toLocalString()还是你想实现自己的方法toLocalString() 请看this answer prototype 属性属于一个函数。该函数在使用new 调用时使用该prototype 属性来构造实例对象。在非函数对象上设置prototype 无效。 【参考方案1】:

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

var car = 
    Make: 'Nissan',
    Model: 'Altima'
; 

这与:

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

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

car.prototype === undefined 作为prototype 属性仅存在于Functions(正如我已经说过的)。

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
;

【讨论】:

【参考方案2】:

你可能想修改构造函数原型:

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

【讨论】:

以上是关于访问 Javascript 对象原型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在构造函数与原型中声明javascript对象方法[重复]

JavaScript原型

Javascript原型使用性能[重复]

对Javascript 类原型链继承的理解

JavaScript面向对象(下)

JavaScript原型&原型链