Object.prototype和Function.prototype一些常用方法


Object.prototype

方法:

  1. hasOwnProperty 概念:用來判斷一個對象中的某一個屬性是否是自己提供的(主要是判斷屬性是原型繼承還是自己提供的) 語法:對象.hasOwnProperty('屬性名')
 var o = { name: 'jim' }; function Person() { this.age = 19; this.address='北京'; this.work='上海'; } Person.prototype = o; var p = new Person(); console.log( p.hasOwnProperty( 'name' ) ); // false 這個 name 屬性不是自己提供的 console.log( p.hasOwnProperty( 'age' ) ); // true 這個 nage 屬性是自己提供的 //for in 遍歷對象時 有時希望遍歷的是對象自己提供的成員而不是從原型那里繼承的 for(var k in p){ if(p.hasOwnProperty(k)){ console.log(k); } }
  1. isPrototypeOf 概念:判斷是不是對象的原型 ;前面這個對象是否在后面這個對象的原型鏈上 語法:對象.isPrototypeOf(對象)
 var o = { name: 'jim' }; function Person() { this.age = 19; this.address='北京'; this.work='上海'; } var p1 = new Person(); Person.prototype = o; var p2 = new Person(); console.log( o.isPrototypeOf( p1 ) ); //false o 不是 p1 的原型 console.log( o.isPrototypeOf( p2 ) );//true o 是 p2 的原型 console.log( Object.prototype.isPrototypeOf( p1 ) );//true Object.prototype 在 p1 的原型鏈上 console.log( Object.prototype.isPrototypeOf( p2 ) );//true Object.prototype 在 p2 的原型鏈上
  1. propertyIsEnumerable 概念:判斷對象的某一個屬性是不是自己提供的( 與 hasOwnProperty 一樣 ), 同時該屬性要求可枚舉( for-in 遍歷出來) 4.補充:(獲得對象類型的方法 typeof) toString 用法:Object.prototype.toString.call(對象)->[Object 構造函數名]

Function.prototype

方法: 1.apply call 用法:上下文調用模式,自定義設置this的含義

語法: 函數名.apply(對象,[參數]) 函數名.call(對象,參數)

描述:

  1. 函數名就是表示函數本身,使用函數進行調用的時候默認this 就是全局變量

  2. 函數名是方法時,this是指當前對象

  3. 使用apply調用后,無論是函數還是方法this都由apply的第一個參數決定

注意:

  1. 如果函數或方法中沒有this的操作,無論什么調用都一樣

  2. 如果是函數調用foo(),有點像foo.apply(window)

  3. 如果是方法調用o.method(),有點像o.method.apply(o)

參數問題:如果函數或方法無參數時,用call或是apply都一樣

第一個參數的使用規則:

  1. 如果傳入的是一個對象,就是設置該函數或方法中的this指向這個對象
 var func2 = function() { this.name = "程序員"; }; var o={name:'xjj'}; func2.apply(o); console.log(o.name);// 程序員
  1. 如果不傳參或傳入為null undefined等 this默認為window

  2. 如果傳入的是基本數據類型,this就指向這個基本類型對應的包裝類型的引用

第二個參數:在使用上下文調用時,如果原函數或方法有參數,那么就使用第二個參數來表示

應用:上下文調用只是能修改this,但是最多使用的是借用函數調用

 var a = {}; a[ 0 ] = 'a'; a[ 1 ] = 'b'; a.length = 2; var arr=[]; var newArr=arr.push.apply(arr,a); push 返回所加元素的個數,newArr=2;arr=["a", "b"] a是一個偽數組,無法使用數組的方法, 處理數組轉換,可以使用apply將數組或偽數組展開的特性,將元素一個一個取出來構成一個新數組

在來一個例子:

 var a = { length: 0 }; a[ a.length++ ] = 'abc'; a[ a.length++ ] = 'def'; var arr=[]; var newArr=arr.slice.apply(a,[0]); 結果為: newArr=["abc", "def"]; slice語法: arr.slice( index, endIndex ) 從index開始,endIndex取不到 返回的是截取到元素 如果第二個參數不傳, 那么就是 從 index 一致獲取到結尾,該方法不會修改原數組

2.caller 概念:一般不推薦使用. 獲得函數的調用者.

3.bind 概念:綁定, 這個語法來源於 ES5

 var f = document.getElementById; f( 'id' ); //這樣會報錯 非法調用 f.call( document, 'id' ); 或者換一種方式: var f = document.getElementById.bind( document ); f( 'id' ); //這樣不會報錯
  1. instanceof 運算符 概念:判斷對象是不是由指定構造方法所創建或者說構造函數的原型屬性是否在對象所在的原型鏈上. 語法: 對象 instanceof 函數 描述: '函數.prototype' 是否在 '對象' 的原型鏈上

     function Person() {} var p = new Person(); console.log( p instanceof Person );//true
    
     function Person(){}; var p1=new Person(); Person.prototype={}; var p2=new Person(); console.log(p1 instanceof Person); //false Person.prototype不在 p1 的原型鏈上 console.log(p2 instanceof Person); //true Person.prototype在 p2 的原型鏈上


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM