首页 > 代码库 > instanceof,Object.getPrototypeOf(),Object.create(),Object.setPrototypeOf(),Object.prototype.isPrototypeOf(),Object.prototype.__proto__

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方法,获取原型对象

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