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

IT技术 javascript prototype prototypal-inheritance
2021-03-16 18:05:49

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

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

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

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

5个回答
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;

为了兼容性,您可以将以下代码段放入您的代码中(并使用 alwaysObject.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__不适用于每个浏览器
2021-04-20 18:05:49
不仅如此__proto__,以上三种方法并不适用于所有浏览器。但是兼容性代码基于所有这些方法。此外,对于五种主要浏览器(IE、FF、Chrome、Safari、Opera),所有最新版本的浏览器都支持Object.getPrototypeOf(),并且仅 IE8 及更早版本需要兼容代码。
2021-05-06 18:05:49

看起来像

Object.getPrototypeOf(passedObject);

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

这是MDN上的兼容性表

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,这是检查原型的最佳方式。
2021-05-11 18:05:49
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
var F = function();
F.prototype.member1 = 1;
var intance = new F();
console.log(instance['member1']);
不鼓励仅代码答案。请添加一些关于如何解决问题的解释,或者这与现有答案有何不同。来自评论
2021-04-27 18:05:49