首页 > 代码库 > 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__
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。