function
class1()
複製**
class
class2()
}複製**
function
teacher()
teacher.prototype.beat = '打學生'
function
student()
var s1 = new student()
console.log(s1)
//student
console.log(s1.beat) <-
//undefined
複製**
原理:通過改變父類建構函式this的指向,使其指向子類的例項缺點:無法繼承父類原型上的方法和屬性,只能繼承父類建構函式上的方法屬性
function
teacher2()
teacher2.prototype.beat = '打學生'
function
student2()
student2.prototype = new teacher2() <-
teacher2.prototype.say() = function()
var s2 = new student2()
console.log(s2)
//student2
// -type: "學生"
// -__proto__: teacher2
// -title: "老師"
// -__proto__:
// -beat: "打學生"
// -constructor: ƒ teacher2()
// -__proto__: object
console.log(s2.beat)
// 打學生
s2.say()
// 666
複製**
原理:子類的原型引用了父類的例項,此時js會順著原型鏈在子類例項
->子類原型 === 父類例項
->父類原型
中依次尋找方法屬性
能通過instanceof
給原型新增方法的語句一定要放在原型指向了父類例項之後
var s3 = new student2()
var s4 = new student2()
s3.title = '老師76'
console.log(s3.title) //老師76
console.log(s4.title) //老師
s3.__proto__.title = '老師76'
console.log(s3.title) // 老師76 <-
console.log(s4.title) // 老師76 <-
s3.type = '畢業了的學生'
console.log(s3.type) //畢業了的學生
console.log(s4.type) //學生
s3.array1.push('abc')
console.log(s3.array1) // [1, 2, 3, "abc"] <-
console.log(s4.array1) // [1, 2, 3, "abc"] <-
s3.array2.push('def')
console.log(s3.array2) // [7, 8, 9, "def"]
console.log(s4.array2) // [7, 8, 9,]
//罪魁禍首:
s3.__proto__ === s4.__proto__ // true
複製**
記住js順著原型鏈往上尋找方法和屬性,先在子類例項中(由子類建構函式獲得的屬性方法)找,再去子類的原型(已經指向了父類例項)中找......同時父類例項又有自己的__proto__
...真是繞.....
缺點:子類的例項共享同乙個原型,修改乙個子類的屬性另乙個也會改變
function
teacher3()
function
student3()
student3.prototype = new teacher3() <-
var s5 = new student3()
var s6 = new student3()
s5.array3.push(4)
console.log(s5.array3) // [1,2,3,4]
console.log(s6.array3) // [1,2,3]
複製**
缺點,例項化了三次優化版本1
function
teacher4 ()
function
student4 ()
student4.prototype = teacher4.prototype // <-
var s7 = new student4()
var s8 = new student4()
s7.array3.push(4)
console.log(s7.array3) // [1,2,3,4]
console.log(s8.array3) // [1,2,3]
複製**
只在例項化的時候才例項類
__上述兩種共同的缺點:最終產生的例項的建構函式都會指向父類建構函式
原因:student4.prototype = teacher4.prototype
或者student3.prototype = new teacher3()
__
s5.constructor = function
teacher3()
s7.constructor = function
teacher4()
複製**
優化版本2function
teacher5 ()
function
student5 ()
student5.prototype = object.create(teacher5.prototype) // <-
// object.creat() 創造的中間物件的原型物件就是傳入的引數
// 此時中間物件的原型也就是父類的原型
// 中間物件通過類似在原型鏈上「加一段」的方式把父子類的構造器隔開
var s9 = new student5()
console.log(s9.constructor) //依然為父類構造器
複製**
最終版本function
teacher6 ()
function
student6 ()
student6.prototype = object.create(teacher6.prototype) // <-
student6.prototype.constructor = student6 // <-!!!!!
var s10 = new student6()
console.log(s10 instanceof teacher6,s10 instanceof student6)
// true true
console.log(s10.constructor) // student5 ()
複製**
kill it! java物件導向複習
1 記憶體 pc主要原件 cpu 記憶體 硬碟 執行著的程式在記憶體裡,記憶體是臨時儲存器。沒有執行的程式在硬碟上,硬碟是永久性儲存器。2 和資料庫無關的程式都是只在記憶體裡執行,屬於曇花一現。寫程式的實質就是在操作記憶體。int a 10 和記憶體要一塊空間,名字叫 a,大小 4個位元組,把 10...
物件導向複習5 1
1.構造器通常的形式為假定有類為person,則構造器建立物件為person p new person new呼叫構造器建立物件person並賦值給乙個person變數p。這裡可以看出構造器是乙個和類同名的方法,構造器的作用就是為類建立物件。2.static 只需要記得static修飾的成員變數屬於...
物件導向的複習
物件導向通過函式 封裝得到乙個類,備註 類的本質還是函式 1 每個類 函式 天生有乙個 prototype 的屬性,這個 prototype 又是乙個物件,這個物件裡面有個 construction 建構函式 的屬性,屬性值是類本身。2 我們所有 new 乙個類的時候,其實是呼叫它的建構函式。建構函...