timg (2).jpeg
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); //引用类型共享了
结果如图:
9800.png
这里我们可以看到 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"]