【问题标题】:How to access object prototype in javascript?如何在 javascript 中访问对象原型?
【发布时间】:2011-12-01 12:09:18
【问题描述】:

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

到目前为止,我已经尝试了以下代码sn-p:

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

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

【问题讨论】:

  • object1.constructor.prototype

标签: javascript prototype prototypal-inheritance


【解决方案1】:
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;

为了兼容性,您可以将以下 sn-p 放入您的代码中(并始终使用 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__:

【讨论】:

  • 只有一条评论:__proto__ 并非在所有浏览器中都有效
  • 不仅__proto__,以上三种方法都不适用于所有浏览器。但是兼容性代码是基于所有这些方法的。另外,对于五种主流浏览器(IE、FF、Chrome、Safari、Opera),所有最新版本的浏览器都支持Object.getPrototypeOf(),并且兼容代码仅适用于 IE8 和更早版本。
【解决方案2】:

看起来像

Object.getPrototypeOf(passedObject);

适用于此,并且与现代浏览器兼容。

这里是 compatibility tables on MDN

【讨论】:

    【解决方案3】:
    var F = function(){};
    var object1 = new F();
    alert(object1.constructor === F);
    alert(object1.constructor.prototype === F.prototype);
    

    【讨论】:

    • 请注意,有时它不起作用。例如 a = Function.prototype; a.constructor.prototype 将等于 a。但显然 a 的原型是不同的。您可以通过检查 a.__proto__ 来确认 a 的原型是 Object.prototype,这是检查原型的最佳方法。
    【解决方案4】:
    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
    

    【讨论】:

      【解决方案5】:
      var F = function();
      F.prototype.member1 = 1;
      var intance = new F();
      console.log(instance['member1']);
      

      【讨论】:

      • 不鼓励仅使用代码的答案。请添加一些解释,说明这是如何解决问题的,或者这与现有答案有何不同。 From Review
      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2022-07-06
      相关资源
      最近更新 更多