【js 中須要特別注意的地方記錄(下篇)】 js原型鏈和繼承的理解

  • Object() Function() Array() 等等都爲構造函數。
  • Js 面向對象與傳統oop 有些不一樣,語法較高級 語法糖封裝。
  • This 爲指針。指向this做用域的調用者

原型

  1. 原型繼承鏈頂端爲Object 。Js函數是對象
  2. 當讀取對象中的屬性時,先去實例自己中搜索,如搜索不到則去指向的原型中搜索
  3. .prototype是一個對象 。裏面有一個構造器屬性constructor。實例中也有一個構造器屬性。只有函數有prototype對象和__proto__指針。構造出來的實例只有__proto__ 指針

原型鏈

1.原型的存在乎義在於實現繼承共享,是在構造函數中定義的一個成員對象,在下次實例化時不須要在構造函數中定義成員 就可實現實例共享方法屬性。函數

例子1:oop

一般爲。 構造函數.prototype.xxx=我想實現實例繼承的東西 -》 new 構造函數 -》新實例a對象.原型指針指向構造函數的xxx對象(引用類型)

例子2:this

Array 不等於 Array() 緣由 Array爲一個函數,而Array()爲一個構造函數調用語句,故Array擁有prototype對象用於實例的共享繼承,Array()產生一個實例 故只能擁有prototype對象的私有指針 proto

2.在使用原型繼承時 不能使用字面量 構造函數.prototype={} 的方式重寫原型對象 。由於會致使該原型對象的constructor屬性被重寫,在生成的實例中致使constructor指向Object而且會切斷以前原型對象的聯繫,破壞原型鏈。prototype

3.JavaScript 主要經過原型鏈實現繼承。原型鏈的構建是經過將一個類型的實例賦值給另外一個構造函數的原型實現的指針

例子3:code

xxx實例.__proto__-》function xxx()構造函數.prototype對象故xxx.__proto__ === xxx.prototype

xxx.prototype.__proto__-》Object.prototype由於全部對象都爲Object函數構造來的。故xxx.prototype.__proto__===Object.prototype。對象

Object.prototype.__proto__爲原型鏈頂端__proto__定義了還沒有使用因此爲null故Object.prototype.__proto__===null約定俗成。繼承

  • instanceof 用來判斷某實例是否爲某構造函數的實例
  • isPrototypeOf 用於判斷某實例是否擁有某構造函數的原型對象指針

繼承

1.原型模式有忽略構造函數定義初始值步驟及原型中操做引用類型的缺點。因此須要組合使用構造函數模式+原型模式來建立實例。在構造函數中定義實例的屬性,而需共享的方法就定義在原型對象中。ip

繼承:在子構造函數中調用 父.call(this, name); 實現構造函數之間的屬性繼承。使用 子.prototype = new 父(); 子.prototype.constructor = 子;實現方法的繼承。 原型鏈

2.如要在生產環境下的構造函數新增方法(如Array) 須要使用一個相似於工廠函數的寄生構造函數模式 在構造函數中返回一個修改後的對象

例子:在子類中使用call()能夠實現繼承
function SuperType(name){
    this.name = name;
} 
function SubType(){//繼承了 SuperType,同時還傳遞了參數 SuperType.call(this, "Nicholas"); 
SuperType.call(this, "Nicholas"); 
//實例屬性 
    this.age = 29;
}
var instance = new SubType();
alert(instance.name);    //"Nicholas";
alert(instance.age);     //29
相關文章
相關標籤/搜索