物件導向小知識

weixin_33976072發表於2017-03-29
  • instanceOf
  • 作用:判斷某個物件是否是由指定的建構函式建立出來的
  • 使用方法:物件 instanceOf 建構函式
  • 例子:
function Person(name,age) {
        this.name = name;
        this.age = age;
    }
    function Dog(name,age) {
        this.name = name;
        this.age = age;
    }
    var obj1 = new Person("張三",20);
    var obj2 = new Dog("旺財",1);
 console.log(obj1 instanceof Person);       //true
    console.log(obj2 instanceof Person);       //false
    console.log(obj1 instanceof Dog);          //false
    console.log(obj2 instanceof Dog);       //true
  • 建構函式注意事項
  • 1.在使用建構函式的時候必須加上new 如果不加上new 那麼可能會出錯,內部就不會建立新的物件,內部的this指向的是window。
  • 2 this : 如果使用new呼叫建構函式,那麼this指向的是新建立的物件。如果普通呼叫,this指向的是window。

再次強調什麼是原型物件

  • 什麼是原型物件
  • 每個建構函式預設都有一個和它相關聯(<->)的物件,這個物件被稱為建構函式的原型物件。
    建構函式找原型物件:prototype
    原型物件找建構函式:constructor
    這個原型物件本身是一個物件,這個物件是Object型別,有一個構造器屬性(constructor)
  • 原型物件的特點
    建構函式的原型物件上面的屬性和方法會被該建構函式建立的所有物件共享
  • 如何訪問原型物件
建構函式.prototype
物件.__proto__
Object.getPrototypeOf(物件)
  • 如何使用原型物件
    利用物件的動態特性
    使用字面量的方式來直接替換
  • 原型物件-建構函式-物件
  • 例項化:使用建構函式建立物件的過程
  • 例項(物件):
    使用建構函式建立出來的物件被稱為該建構函式的一個例項物件。
  • 注意點:我們在說例項物件的時候,需要指明建構函式
    例如:某個物件是哪個建構函式的例項物件
  • 例項成員:例項物件上面的屬性和方法
    原型成員:建構函式原型物件上面的屬性和方法
  • hasOwnProperty
  • 作用:是否擁有指定的例項屬性(不包含原型成員)
  • 使用方法:物件.hasOwnProperty("例項屬性")
  • in關鍵字
  • 檢查物件中是否存在某個指定的屬性(例項成員 + 原型成員)
  • 使用方法:"例項成員或原型成員" in 物件
  • delete關鍵字
  • 作用:刪除物件中的屬性
  • 使用方法:delete 物件.屬性
  • 注意:
    刪除沒有使用var宣告的變數
通常情況下,宣告變數需要使用var關鍵字,預設所有的全域性變數都會成為window的屬性
特殊情況下,不適用var直接賦值也能宣告一個變數 ,預設會成為一個全域性的變數

使用var宣告的全域性變數可以被刪除嗎? 不可以
直接新增在window上面的屬性可以被刪除嗎? 可以

  • 例子:
 function Person(name) {
        this.name = name;
    }
    Person.prototype.hi = "hi";
    var p1 = new Person();
語法 物件.hasOwnProperty("屬性")
    console.log(p1.hasOwnProperty("name")); //true
    console.log(p1.hasOwnProperty("age"));  //false
    console.log(p1.hasOwnProperty("hi"));   //false
語法 “屬性” in 物件
    console.log("name" in p1);           //true
    console.log("age" in p1);            //false
    console.log("hi" in p1);              //true
  • isPrototypeOf
  • 作用:判斷是否是原型物件。
  • 使用方法: isPrototypeOf(物件)
  • 構造器屬性(constructor)
  • 物件的constructor是原型物件上面的constructor屬性,物件本身並沒有這個屬性
  • 建構函式的原型物件(相互關聯),原型物件通過constructor屬性(自己的)來關聯建構函式
  • 原型物件上面有兩個構造器屬性(自己的 + 原型的)
  • Object.create()
  • 作用:建立物件並且設定原型物件
  • 使用方法:建立一個空的物件o,並且設定這個物件的原型物件是obj
  • 例子:var o = Object.create(obj);
  • 注意:相容性處理(ES5)
  • Object.assign()
  • 作用:用來拷貝屬性的,一次性拷貝多個物件的屬性
  • 用法:Object.assign(目標物件,要拷貝屬性的物件1,要拷貝屬性的物件2,要拷貝屬性的物件3)
  • 注意點:
    新特性有相容性問題
    原型成員是否能夠拷貝 不能(預設不會拷貝原型成員)
    使用for..in遍歷拷貝物件的時候,會連同該物件的原型成員一起拷貝
  • call和apply函式(重要)
  • 來源:所有的物件方法都擁有這兩個函式(方法),這兩個方法寫在Function.prototype上面
  • 作用:借用其他物件的方法
  • 用法:
    物件1.方法.call(借用者物件,引數1,引數2,引數3...)
    物件1.方法.apply(借用者物件,[引數1,引數2,引數3...])
  • 區別(傳遞引數):
    引數傳遞不一樣
    期望的形參長度不一樣:
    * 函式.length 形參的個數
    * call:length 1 期望傳遞一個引數
    * apply:length 2 期望傳遞兩個引數

相關文章