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

Bre*_*eak 59 javascript prototype prototypal-inheritance

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

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

var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1
Run Code Online (Sandbox Code Playgroud)

我怎样才能访问原型对象object1?有没有以浏览器为中心的方式(我的意思是,不依赖于__proto__财产?看到这个链接,但也许自2010年以来有新的发展)如果我不能,你能分享一下引擎背后的理由吗?

And*_* D. 107

var f = function();
var instance = new f();
Run Code Online (Sandbox Code Playgroud)

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

var prototype = f.prototype;
prototype.someMember = someValue;
Run Code Online (Sandbox Code Playgroud)

如果你不这样做:

1)

var prototype = Object.getPrototypeOf(instance);
prototype.someMember = someValue;
Run Code Online (Sandbox Code Playgroud)

2)

var prototype = instance.__proto__;
prototype.someMember = someValue;
Run Code Online (Sandbox Code Playgroud)

3)

var prototype = instance.constructor.prototype; // works only if constructor is properly assigned and not modified
prototype.someMember = someValue;
Run Code Online (Sandbox Code Playgroud)

为了兼容性,您可以在代码中放入以下代码段(并始终使用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;

    };

  }
}
Run Code Online (Sandbox Code Playgroud)

更新:

根据ECMA-262第6版(2015年6月),__proto__属性被标准化为Web浏览器的附加功能.所有最新版本的顶级浏览器现在都支持它.了解更多__proto__:

  • 不仅是`__proto__`,而且以上三种方法都不适用于所有浏览器.但兼容性代码基于所有这些方法.另外,对于五种主流浏览器(IE,FF,Chrome,Safari,Opera),所有上一版本的浏览器都支持`Object.getPrototypeOf()`,兼容性代码仅需要IE8及更早版本. (15认同)

Hel*_*rld 6

看起来像

Object.getPrototypeOf(passedObject);
Run Code Online (Sandbox Code Playgroud)

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

这是MDN上的兼容性表


小智 5

var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,有时它不起作用。例如a = Function.prototype; a.constructor.prototype将等于a。但是显然a的原型是不同的。您可以通过检查a .__ proto__来确认a的原型是否为Object.prototype,这是检查原型的最佳方法。 (2认同)