如何在 javascript 中访问对象原型?

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

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

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

如何访问 object1的原型对象?有没有一种与浏览器无关的方法来做到这一点(我的意思是,不依赖于 __proto__属性?看到 这个链接,但也许有新的发展,因为2010年)如果我不能,你能分享背后的兜帽的理由?

86662 次浏览
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
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 浏览器的附加特性。现在所有顶级浏览器的最新版本都支持它。阅读更多关于 __proto__:

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

var F = function();
F.prototype.member1 = 1;
var intance = new F();
console.log(instance['member1']);