javascript繼承的個人總結

2021-09-17 00:01:29 字數 3432 閱讀 2413

開始的**是這樣的

var animal = function(name);

animal.prototype.jump = function();

優點:將可共享的可重用的部分(屬性或者方法)遷移到原型鏈上,將不可重用的部分作為物件的例項屬性(屬性)

var human = function(name);

// 這一步會使得

// human.prototype.constructor = animal;

// 所以需要重新手動重定向

human.prototype = new animal;//將父建構函式的例項物件賦值給乙個子建構函式的原型

// 如果不更改

// 通過`human`構造器構造出來的物件的構造器會變成`animal`而不是`human`

human.prototype.constructor = human;(有new就要手動修改)

var man = new human('haoycn');

man.jump();

現在,物件 man 可以使用 animal.prototype.jump 方法,查詢過程是:

man 自身沒有jump方法

查詢 man.constructor.prototype,即human.prototype,可human.prototype本身也沒有 jump 方法,而它又是乙個由animal 構造的物件,所以

查詢 animal.prototype,在其中找到了 jump 方法,執行之

建立乙個例項物件,物件的prototype指向建構函式的原型(man.constructor.prototype),建構函式中的this指向這個例項物件,執行建構函式,對例項物件的屬性進行賦值,返回這個例項物件

優點:提高了執行時的效率,沒有建立新物件出來。

var human = function(name);

human.prototype = animal.prototype;//將乙個父建構函式的原型直接賦值給子建構函式的原型

var man = new human('haoycn');

man.jump();

man 自身沒有jump方法

查詢 man.constructor.prototype,即human.prototype,human.prototype是對animal.prototype 的引用,在其中找到了 jump 方法,執行之減少了一步。

然而代價則是:對 human.prototype 的修改都會影響到 animal.prototype,因為前者是對後者的引用。

乙個致命缺點就是,無法修正子類構造的物件的 constructor。

var f = function(){};//建立要給空的函式(建構函式:中介構造器)

f.prototype = animal.prototype;//父建構函式的原型賦值給空建構函式的原型

var human = function(name);

human.prototype = new f;//空(父)建構函式的例項物件賦值給子建構函式的原型

human.prototype.constructor = human;//手動修改重定向constructor(有new就要修改)

human.prototype.sing = function();

var man = new human('haoycn');

man.jump();

man.sing();

我們對 human.prototype 的任何改變都變成了對乙個由中介構造器建立的物件的屬性的修改。jump查詢過程是:

man 自身沒有jump方法

查詢 man.constructor.prototype,即human.prototype,可human.prototype本身也沒有jump 方法,而它又是乙個由 f 構造的物件,所以

查詢 f.prototype,即 animal.prototype,在其中找到了 jump 方法,執行之

先看「原型鏈繼承法」中的操作:

human.prototype = new animal;

// 這將造成:

// human.prototype.name = undefined;// 沒有給`animal`傳入引數之故

也就是說,human.prototype 會多出不必要的屬性來,而中介器則避免了這種不必要的屬性。

以上繼承法共通的乙個缺點在於,human 構造器構造的物件雖然可以共用 animal.prototype,但對於name 屬性而言,human 構造器只能自己再寫一遍構造 name 屬性,為什麼不把初始化屬性的方法也共(借)用呢?

構造器借用法應運而生。現在我們把 name 屬性的建立還是交給 animal,然後再為 human 增加country 屬性。我們在「臨時構造器法」基礎上進一步完善之。

var f = function(){};//建立要給空的函式(建構函式:中介構造器)

f.prototype = animal.prototype;//父建構函式的原型賦值給空建構函式的原型

//建立子建構函式

var human = function()

human.prototype = new f;//空(父)建構函式的例項物件賦值給子建構函式的原型

human.prototype.constructor = human;//手動修改重定向constructor

JavaScript 繼承 組合繼承

繼承 組合繼承 組合繼承也叫做偽經典繼承,指的是將原型鏈和借用建構函式的技術組合到一塊,從而發揮二者之長的一種繼承模式。組合繼承的基本思路是使用原型鏈實現對原型屬性和和方法的繼承,而通過借用建構函式來實現對例項屬性的繼承。組合繼承通過在原型上定義方法實現了函式復用,又能夠保證每個例項都有它自己的屬性...

javascript中的繼承

最常見的三種繼承方式 1.建構函式繼承 建構函式繼承 function people name function student school 例項方法 people.prototype.show function var stu new student 星星幼兒園 stu.name 小明 stu....

javascript的組合繼承

需要先說明一點,這篇部落格是基於高程來寫的,這裡只是加上自己的理解而已。function supertype supertype.prototype.sayname function function subtype subtype.prototype new supertype var insta...