一.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
方法,獲取原型對象
- 推薦使用第三種