一、原型
1.什么是原型:
在构造函数创建出来的时候,系统会默认的帮构造函数创建并关联一个对象,这个对象就是原型,构造函数的每一个实例都可以访问原型中的成员(一般我们放的是方法);
原型的作用:
1)、通过原型来添加方法,解决数据共享,节省内存空间
2)、作用于继承,模拟面向对象,来做到继承,多态
eg:
//构造函数
function People(name, age) {
this.name = name;
this.age = age;
};
2.原型链
首先,正如上面所说的,当函数被new操作符调用时,会创建出一个对象,并且该对象中会有一个指向其原型对象的链接(一个非标准属性:_proto_),这样新建的对象(实例)就可以调用相关原型对象中的成员;但是,原型对象自身也具有对象固有的普遍特征(它也是个对象),因此,也包含了指向其原型对象的链接,因此,就形成了一个链式结构,称之为原型链。
二、继承
1.简单来说就是一个对象没有的成员(女朋友),但是另一个对象有,给它拿过用用(嘿嘿嘿!!);
2.继承的过程: 王校长老婆他妈跟他要10个亿,王校长没有咋办?找他爹王健林,王健林也没有,咋整?把万达卖了,就有了;要是卖了也不够,那就返回null.;
3.继承的三种方式:
1).构造继承
核心:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类。
function Father(name, age) {
this.name = name;
this.age = age;
}
Father.prototype.eat = function () { //给原型添加eat方法
console.log(this.name + "策马奔腾");
}
var box = new Father("吕小布", 20); //创建新对象box, [[proto]]指向父原型
function Son() {
}
Son.prototype = box; //将子构造函数的prototype指向了父类型的对象,这里实现了——继承
var Q = new Son(); // 创建子对象
Q.eat(); //吕小布策马奔腾
最终结果:
2).原型式继承:
function object(o) {
function F() { }
F.prototype = o;
return new F();
}
使用场合:没必要构建构造函数,仅仅是想模拟一个对象的时候
3).寄生继承:
function createAnother(original) {
var clone = object(original); //通过调用函数创建一个新对象
clone.sayHi = function () { //以某种方式来增强这个对象
alert("hi");
};
return clone; //返回这个对象
}
var person = {
name: "Nicholas",
friends: ["Shelby", "Court", "Van"]
};
var anotherPerson = createAnother(person);
anotherPerson.sayHi(); //"hi"
缺点:方法在函数中定义,无法得到复用