instanceof,Object.getPrototypeOf(),Object.create(),Object.setPrototypeOf(),Object.prototype.isPrototypeOf(),Object.prototype.__proto__


一.instanceof

instanceof運算符返回一個布爾值,表示指定對象是否為某個構造函數的實例

var v = new Vehicle();
v instanceof Vehicle // true

instanceof對整個原型鏈上的對象都有效,因此同一個實例對象,可能會對多個構造函數都返回true

var d = new Date();
d instanceof Date // true
d instanceof Object // true

利用instanceof運算符,還可以巧妙地解決,調用構造函數時,忘了加new命令的問題

function Fubar (foo, bar) {
  if (this instanceof Fubar) {
    this._foo = foo;
    this._bar = bar;
  }
  else {
    return new Fubar(foo, bar);
  }
}

二.Object.getPrototypeOf()

Object.getPrototypeOf方法返回一個對象的原型。這是獲取原型對象的標准方法。

// 空對象的原型是Object.prototype
Object.getPrototypeOf({}) === Object.prototype
// true

// 函數的原型是Function.prototype
function f() {}
Object.getPrototypeOf(f) === Function.prototype
// true

// f 為 F 的實例對象,則 f 的原型是 F.prototype
var f = new F();
Object.getPrototypeOf(f) === F.prototype
// true

三.Object.create()(在原型上生成新的對象的實例)

Object.create方法用於從原型對象生成新的實例對象

實際上,Object.create方法可以用下面的代碼代替。如果老式瀏覽器不支持Object.create方法,可以就用這段代碼自己部署

if (typeof Object.create !== 'function') {
  Object.create = function (o) {
    function F() {}
    F.prototype = o;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    return new F();
  };
}

object.create方法生成的新對象,動態繼承了原型。在原型上添加或修改任何方法,會立刻反映在新對象之上。

var o1 = { p: 1 };
var o2 = Object.create(o1);//o1成為了o2.poptotype上的對象,相當於 o2.prototype = new o2(); 
o1.p = 2;
o2.p
// 2

四.Object.setPrototypeOf()

Object.setPrototypeOf方法可以為現有對象設置原型,返回一個新對象。

Object.setPrototypeOf方法接受兩個參數,第一個是現有對象,第二個是原型對象。

var a = {x: 1};
var b = Object.setPrototypeOf({}, a);
// 等同於
// var b = {__proto__: a};

b.x // 1

五.Object.prototype.isPrototypeOf()

對象實例的isPrototypeOf方法,用來判斷一個對象是否是另一個對象的原型。(配合Object.create()理解)

var o1 = {};
var o2 = Object.create(o1);
var o3 = Object.create(o2);

o2.isPrototypeOf(o3) // true
o1.isPrototypeOf(o3) // true

只要某個對象處在原型鏈上,isPrototypeOf都返回true

六.Object.prototype.__proto__

__proto__屬性(前后各兩個下划線)可以改寫某個對象的原型對象。

var obj = {};
var p = {};

obj.__proto__ = p;
Object.getPrototypeOf(obj) === p // true

七.獲取實例對象的原型

  • obj.__proto__
  • obj.constructor.prototype
  • Object.getPrototypeOf(obj)
    •     推薦使用第三種Object.getPrototypeOf方法,獲取原型對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM