1:純淨的繼承者 — 原型式繼承
//傳遞一個字面量函數
function obj(o) {
//創建一個構造函數
function F() {}
//把字面量函數賦值給構造函數的原型
F.prototype = o;
//最終返回出實例化的構造函數
return new F();
}
//字面量對象
var box = {
name: 'lume',
books: ['JavaScript', 'python', 'go']
};
var box1 = obj(box); //傳值
console.log(box1.name); // lume
box1.name = 'lumi'; // lumi
console.log(box1.name);
console.log(box1.books);
box1.books.push('java');
console.log('box1',box1.books);
var box2 = obj(box); //傳值
console.log(box2.name);
console.log('box2',box2.books); //引用類型共享了
結果如圖:
這裏我們可以看到 box2 的引用類型的值 也被修改了 ! ,還有不明白的 可以看下 注意下 上面代碼的註解 理解下 !
2:如虎添翼 —– 寄生式繼承
寄生式繼承就是把原型式繼承再次封裝,然後在對象上擴展新的方法,再把新對象返回
// 先寫一個原型
function fn(obj) {
var F = function(){}
F.prototype = obj;
return new F;
}
var book = {
name: "JavaScript book",
books : ["python","go"]
}
function createBook(obj){
// clone 一個新對象
var clone = fn(obj);
// 增強新對象
clone.age = 18;
clone.getName = function(){
console.log(name);
}
return clone; // 最後返回這個新對象
}
var obj1 = new createBook(book);
console.log(obj1.books); // ["python","go"]
3: 終極繼承者 —- 寄生組合式繼承