instanceof,Object.getPrototypeOf(),Object.create(),Object.setPrototypeOf(),Object.prototype.isProtot

一.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命令的問題this

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

二.Object.getPrototypeOf()

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

// 空對象的原型是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方法用於從原型對象生成新的實例對象prototype

實際上,Object.create方法能夠用下面的代碼代替。若是老式瀏覽器不支持Object.create方法,能夠就用這段代碼本身部署code

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方法能夠爲現有對象設置原型,返回一個新對象。blog

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方法,獲取原型對象
相關文章
相關標籤/搜索