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方法,获取原型对象
时间: 2024-08-09 02:22:03

instanceof,Object.getPrototypeOf(),Object.create(),Object.setPrototypeOf(),Object.prototype.isPrototypeOf(),Object.prototype.__proto__的相关文章

Effective JavaScript Item 31 优先使用Object.getPrototypeOf,而不是__proto__

本系列作为Effective JavaScript的读书笔记. 在ES5中引入了Object.getPrototypeOf作为获取对象原型对象的标准API.可是在非常多运行环境中.也提供了一个特殊的__proto__属性来达到相同的目的. 由于并非全部的环境都提供了这个__proto__属性,且每一个环境的实现方式各不同样,因此一些结果可能不一致: // 在某些环境中 var empty = Object.create(null); // object with no prototype "__

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, prop, descriptor) 参数 obj 需要定义属性的对象. prop 需定义或修改的属性的名字. descriptor 将被定义或修改的属性的描述符. 返回值 返回传入函数的对象,即第一个参数obj 描述EDIT 该方法允许精确添加或修改对象的属性.一般情况下,我们为对象添加属性是通过

启动MongoDB时,提示:error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

启动MongoDB时,提示: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory [[email protected] ~]# /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath /usr/local/mongodb/logs/mon

Android蓝牙开发,报BluetoothAdapter﹕ Can't create handler inside thread that has not called Looper.prepare

这个错误翻译的意思是:不能在没有Looper.prepare的线程里面创建handler. 起初我很疑惑,我根本没有用到工作线程,也没有创建handler.报错的代码如下: // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final Blu

慎用create table as select,不会copy约束,主键什么东东都不会复制

1.再做一些数据迁移时候,很多人会使用create table  as select * from table where id=-1的方式来年建立一摸一样的表,但是这样做有个很大的弊端,不能将原表中的default value也一同迁移过来. 2.  Using the CREATE TABLE ... AS SELECT ... command: This command will copy acrooss to the new table all the data,but the cons

[Effective JavaScript 笔记]第31条:使用Object.getPrototypeOf函数而不要使用__proto__属性

ES5引入Object.getPrototypeOf函数作为获取对象原型的标准API,但由于之前的很多js引擎使用了一个特殊的__proto__属性来达到相同的目的.但有些浏览器并不支持这个__proto__属性,所以并不是完全兼容的.例如对于拥有null原型的对象,不同的环境结果就不同了. var empty=Object.create(null); '__proto__' in empty;//一些环境会返回false,另一些会返回true 这就导致结果的不一致,从而影响到依赖这个判断的相关

session自定义存储,如何更好地进行session共享;读tomcat7源码,org.apache.catalina.session.FileStore可知

session自定义存储,如何更好地进行session共享: 读tomcat源码,org.apache.catalina.session.FileStore可知 一.详见: 方法1 public void save(Session session) try { ((StandardSession)session).writeObjectData(oos); } finally { oos.close(); } 方法2 public Session load(String id) ois = ne

以麦当劳,肯德基优惠券接口数据为例进行的数据解析方法,简单易懂

以麦当劳,肯德基优惠券接口数据为例进行的数据解析方法,简单易懂,这是我个人觉得是一种比较简单易懂的json数据解析方法: 看下其中一个类的代码 package com.example.text_json_deno_model; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;

object.getPrototypeOf函数(javascript)

返回对象的原型. 语法 Object.getPrototypeOf(object) 参数 object 必需.引用原型的对象. 返回值 object 参数的原型.原型也是对象. 异常 如果 object 参数不是对象,则将引发 TypeError 异常. function Pasta(grain, width) { this.grain = grain; this.width = width; } var spaghetti = new Pasta("wheat", 0.2); var