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

时间:2011-10-05 13:37:28

标签: javascript prototype prototypal-inheritance

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

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

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

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

5 个答案:

答案 0 :(得分:103)

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__

答案 1 :(得分:5)

var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);

答案 2 :(得分:4)

看起来像是

Object.getPrototypeOf(passedObject);

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

以下是 compatibility tables on MDN

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

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