簡體   English   中英

如何在javascript中訪問對象原型?

[英]How to access object prototype in javascript?

在所有文章中都寫道,JavaScript是一種基於原型的語言,這意味着每個對象都有一個原型(或更確切地說,原型鏈)。

到目前為止,我已經嘗試了以下代碼片段:

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

如何訪問object1的原型對象? 有沒有以瀏覽器為中心的方式(我的意思是,不依賴於__proto__屬性?看到這個鏈接,但也許自2010年以來有新的發展)如果我不能,你能分享一下引擎蓋背后的理由嗎?

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__

看起來像

Object.getPrototypeOf(passedObject);

將適用於此,並與現代瀏覽器兼容。

以下是MDN上的兼容性表

var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
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']);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM