JS原型相關

我的對於原型鏈的相關東西一直處於一個很混亂的狀態,一直沒找時間梳理,春節之際給本身放個假,也整理下本身想看的東西bash

相關書籍《你不知道的JavaScript上卷》函數

  • for...in會遍歷原型鏈上全部屬性

屬性的設置和屏蔽

假設有一個對象myObj,執行語句ui

myObj.foo = "a";
複製代碼

可能出現的幾種狀況:spa

  • 若是myObj的原型鏈和myObj都沒有這個屬性,則會直接添加到myObj上
  • 若是myObj有改屬性,則會修改已有屬性
  • 若是foo存在在原型鏈上,而且沒有被標記爲只讀,則會直接在myObj上添加一個foo,他會屏蔽原型鏈上的foo
  • 若是foo存在在原型鏈上,而且被標記爲只讀,則沒法修改該屬性,也沒法賦值
  • 若是foo存在在原型鏈上且是一個setter,則會調用,不會添加到myObj上

"類"函數

常常看到這種寫法prototype

function Foo () {};
var a = new Foo();
複製代碼

這裏執行new的這一步實際是將a的原型鏈指向Foo.prototype,注意這裏比較坑的是new的時候並非複製Foo.prototype而是直接指向,因此若是new多個對象,他們全部的原型鏈都指向同一個對象!code

"構造函數"

function Foo () {};
var a = new Foo();
Foo.prototype.constructor === Foo; //true
a.constructor === Foo;
複製代碼

使用Object.create()繼承

Object.create()會建立一個新對象,並把該對象的原型鏈關聯到指定對象上;對象

// Object.create()的polyfill代碼
if (!Object.create) {
    Object.create = function (obj) {
        function F () {}
        F.prototype = obj;
        return new Foo();
    }
}
複製代碼

檢查「類」的關係

  • 經過instanceof
function Foo () {}
Foo.prototype.blah = 'a';
var a = new Foo();
a instanceof Foo //true;
複製代碼

這裏判斷的是a的原型鏈是否有指向Foo.prototype;繼承

幾個方法

  • Object.isPrototypeOf();
  • Object.getPrototypeOf();
相關文章
相關標籤/搜索