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方法,获取原型对象
相关文章
相关标签/搜索