如何在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上的兼容性表