所有文章都写到 JavaScript 是一种基于原型的语言,这意味着每个对象都有一个原型(或者更准确地说,原型链)。
到目前为止,我已经尝试过以下代码片段:
var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1
我如何访问原型对象object1
?有没有一种与浏览器无关的方法来做到这一点(我的意思是,不依赖于__proto__
财产?见过this https://stackoverflow.com/questions/2242518/how-can-i-see-a-javascript-objects-prototype-chain链接,但也许自 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) or
var prototype = instance.__proto__;
prototype.someMember = someValue;
3) or
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;
};
}
}
UPDATE:
根据 ECMA-262 第 6 版(2015 年 6 月)__proto__
属性被标准化为 Web 浏览器的附加功能。现在所有最新版本的顶级浏览器都支持它。阅读更多关于__proto__
:
MDN: Object.prototype.__proto__ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
EDMA-262 第 6 版(2015 年 6 月):B.2.2.1 Object.prototype.__proto__ http://www.ecma-international.org/ecma-262/6.0/#sec-object.prototype.__proto__
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)