如何在JavaScript中访问对象的原型?

在所有的文章中都写到,JavaScript是一种基于原型的语言,这意味着每个对象都有一个原型(或者更准确地说是原型链)。

到目前为止,我已经尝试了下面的代码片段:

var F = function(); F.prototype.member1 = 1; var object1 = new F(); console.log(object1.member1); // prints 1 

我如何访问object1的原型对象? 有没有一个浏览器中立的方式来做到这一点(我的意思是,不依靠__proto__属性?看到这个链接,但也许有自2010年以来有新的发展)如果我不能,请你分享背后的理由吗?

 var f=function(); var instance=new f(); 

如果你知道instance 类函数的名字,你可以简单地访问原型:

 var prototype=f.prototype; prototype.someMember=someValue; 

如果不知道:

1)

 var prototype=Object.getPrototypeOf(instance); prototype.someMember=someValue; 

2)或

 var prototype=instance.__proto__; prototype.someMember=someValue; 

3)或

 var prototype=instance.constructor.prototype; // works only if constructor is properly assigned and not modified prototype.someMember=someValue; 

为了兼容性,你可以放在你的代码中(并且总是使用Object.getPrototypeOf(instance)来返回原型):

 if(!Object.getPrototypeOf) { if(({}).__proto__===Object.prototype&&([]).__proto__===Array.prototype) { Object.getPrototypeOf=function getPrototypeOf(object) { return object.__proto__; }; } else { Object.getPrototypeOf=function getPrototypeOf(object) { // May break if the constructor has been changed or removed return object.constructor?object.constructor.prototype:void 0; }; } } 

更新:

根据ECMA-262第6版(2015年6月), __proto__属性被标准化为Web浏览器的附加function。 所有最新版本的顶级浏览器现在都支持它。 阅读更多关于__proto__

MDN: Object.prototype.__proto__

EDMA-262第6版(2015年6月): B.2.2.1 Object.prototype.__proto__

 var F = function(){}; var object1 = new F(); alert(object1.constructor === F); alert(object1.constructor.prototype === F.prototype); 
 var F = function(); F.prototype.member1 = 1; F.prototype.getClass = F; var object1 = new F(); object1.member1 = 2; console.log(object1.getClass.prototype.member1); // prints 1 console.log(object1.member1); // prints 2 

看起来像

 Object.getPrototypeOf(passedObject); 

将为此工作,并与现代浏览器兼容。

这是MDN上的兼容性表