關於原型的繼承問題

2021-10-01 13:59:51 字數 2378 閱讀 9885

原型作用:資料共享,目的:為了節省記憶體空間,

原型作用:繼承 目的是:為了節省記憶體空間

原型繼承:改變原型的指向

借用建構函式繼承: 主要解決屬性的問題

組合繼承:原型繼承+借用建構函式繼承

function person(name, age, ***, weight) 

person.prototype.sayhi = function()

function student(score)

//希望人的類別中的資料可以共享給學生---繼承

student.prototype = new person("小明", 10, "男", "50kg")

var stu1 = new student("100")

stu1.sayhi()

console.log(stu1.name, stu1.age, stu1.***, stu1.weight, stu1.score)

var stu2 = new student("120")

stu2.sayhi()

console.log(stu2.name, stu2.age, stu2.***, stu2.weight, stu2.score)

var stu3 = new student("130")

stu3.sayhi()

console.log(stu3.name, stu3.age, stu3.***, stu3.weight, stu3.score)

原型繼承: 為了資料共享,改變原型指向,做到了繼承----通過改變原型指向實現的繼承

缺陷:因為改變原型指向的同時實現繼承,直接初始化了屬性,繼承過來的屬性的值都是一樣的了,所以,這就是問題

只能重新呼叫物件的屬性進行重新賦值

解決方案:繼承的時候,不用改變原型的指向,直接呼叫父級的建構函式的方案來為屬性賦值就可以了-----借用建構函式:把要繼承的父級的建構函式拿過來,使用一下就可以了。

function person(name, age, ***, weight) 

person.prototype.sayhi = function()

function student(name, age, ***, weight, score)

var stu1 = new student("小明", 10, "男", "50kg", "100")

console.log(stu1.name, stu1.age, stu1.***, stu1.weight, stu1.score)

var stu2 = new student("小紅", 10, "女", "50kg", "120")

console.log(stu2.name, stu2.age, stu2.***, stu2.weight, stu2.score)

var stu3 = new student("小綠", 10, "男", "50kg", "130")

console.log(stu3.name, stu3.age, stu3.***, stu3.weight, stu3.score)

借用建構函式:建構函式名字.call(當前物件,屬性,屬性,屬性....);

解決了屬性繼承,並且值不重複的問題

缺陷:父級類別中的方法不能繼承

function person(name, age, ***) 

person.prototype.sayhi = function()

function student(name, age, ***, score)

//改變原型指向----繼承

student.prototype = new person() //不傳值

student.prototype.eat = function()

var stu = new student("小白", 20, "男", "100分")

console.log(stu.name, stu.age, stu.***, stu.score);

stu.sayhi()

stu.eat()

var stu1 = new student("小黑", 22, "女", "120分")

console.log(stu1.name, stu1.age, stu1.***, stu1.score);

stu1.sayhi()

stu1.eat()

//屬性和方法都被繼承了

組合繼承:原型繼承+借用建構函式繼承

屬性和方法都被繼承了

因此,組合繼承是結合了原型繼承和借用建構函式繼承,所以組合繼承更適用。

關於javascript的原型繼承

經常會看到乙個 array prototype.slice.call arguments 這樣的用法。對於prototype和call函式難以理解。無意中在一篇部落格中看到這樣一幅圖,頓時明白了許多。比如說通過function建立了乙個函式person,這個person就是乙個特殊的物件。假設per...

關於js原型繼承

js的每個類都有乙個prototype物件 訪問物件的屬性時,會先訪問到物件自身是否有定義這個屬性 如果沒有定義,就會去訪問物件所屬型別的prototype物件是否有此屬性 原型繼承就是把型別的prototype指向乙個父類的新物件,這樣每派生乙個新類出來都會構造乙個新的父類物件作為原型,這個物件和...

關於繼承和原型鏈

繼承是父物件的成員,子物件不用重複建立,也可以直接使用 這樣就可以節約記憶體,重用。那我們什麼時候使用繼承呢?只要一類子物件,都需要相同的甦醒或功能時,只要將相同的屬性和功能僅在父物件中定義一次即可。那我們怎麼使用呢,js中的繼承都是繼承原型物件。原型物件又是什麼呢?它是專門集中儲存一類子物件相同屬...