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
方法返回一個對象的原型。這是獲取原型對象的標準方法。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
方法用於從原型對象生成新的實例對象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
方法能夠爲現有對象設置原型,返回一個新對象。blog
Object.setPrototypeOf
方法接受兩個參數,第一個是現有對象,第二個是原型對象。繼承
var a = {x: 1}; var b = Object.setPrototypeOf({}, a); // 等同於 // var b = {__proto__: a}; b.x // 1
對象實例的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
__proto__
屬性(先後各兩個下劃線)能夠改寫某個對象的原型對象。
var obj = {}; var p = {}; obj.__proto__ = p; Object.getPrototypeOf(obj) === p // true
obj.__proto__
obj.constructor.prototype
Object.getPrototypeOf(obj)
Object.getPrototypeOf
方法,獲取原型對象