NPD 美國 6 月遊戲報告出爐:Xbox Series 位居主機銷售額榜第一
阿新 • • 發佈:2021-07-19
繼承的發展史
1.傳統形式(原型繼承) ,過多繼承了沒有用的屬性
例子:
Grand.prototype.lastName = '張三'; function Grand(){this.age = 25} var grand = new Grand(); Father.prototype = grand; function Father(){this.sex = '男'} var father = new Father(); Son.prototype = father; function Son(){} var son = new Son(); console.log(son.lastName);
2.借用建構函式(call/apply),不能繼承建構函式的原型,多走一個函式
例子:
// 借用建構函式 A.prototype.lastName = '李四'; function A(){ this.age = 26; this.name = '張三'; this.sex = '男'; } function B(age,name,sex,address){ A.call(this,age,name,sex); this.address = 'beijing'; } var b = new B(); console.log(b.lastName);
3.共享原型,不能隨便改動自己的原型 (使用廣)
// 共享原型 A.prototype.lastName='王五'; function A(){} B.prototype = A.prototype; function B(){} var b = new B(); console.log(b.lastName); // 封裝一下 function extend(Target,Origin){ Target.prototype = Origin.prototype; } A.prototype.lastName = '趙六'; function A(){} function B(){} var b = new B(); extend(B,A); console.log(b.lastName);
4.聖盃模式
// 聖盃模式(完美版繼承) var extend = (function(){ var F = function(){}; return function(Target,Origin){ F.prototype = Origin.prototype; Target.prototype = new F(); // 讓建構函式迴歸 Target.prototype.constructor = Target; // Target到底繼承誰 // Traget.prototype.uber = Origin.prototype; } }()) A.prototype.lastName = '田七'; function A(){} function B(){} extend(B,A); var b = new B(); console.log(b.lastName);