对象概念:对象就是无序属性的集合
prototype:这个属性是指针,指向一个对象。通过调用构造函数对象而创造的对象实例的原型对象。
主要几个类型用法
一.工厂模式
(空对象,Object是所有对象的祖先)
var obj = new Object();
console.info(obj);
obj.name = "flash boy";
console.info(obj);
function createPerson(name) {
var o = new Object();
o.name = name;
return o;(o这个变量存了一个地址,把地址返回给p)
}
var p = createPerson("洋洋");
console.info(p);
二.构造函数
function Student(name) {
this.name = name;
}
var stu = new Student("张三");
——————————————————————————————————————————————————————————————————
工厂模式和构造函数的区别:
1.首字母小写
2.函数中没有使用this
3.使用的时候没有用new
——————————————————————————————————————————————————————————————————
三.构造原型方式(套路)
function Student(name) {
this.name = name;
}
Student.prototype.study = function() {
console.info(this.name + "");
}
var stu = new Student("");
stu.study();
——————————————————————————————————————————————————————————————————
创建类
1.属性全部放在构造函数里面
2.方法写在外面(prototype)
——————————————————————————————————————————————————————————————————
四.借用构造函数
function People(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.sleep = function() {
}
}
People.prototype.study = function() {
}
function Student(name, age, sex) {
People.call(this, name, age, sex);
}
var stu = new Student("张三", 23, "女");
console.info(stu.name);
console.info(stu);
——————————————————————————————————————————————————————————————————
People:构造函数
call():调用People,相当于People()
this:this表是该引用本身(我)
——————————————————————————————————————————————————————————————————
五.原型模式
function Person() {
}
——————————————————————————————————————————————————————————————————
运行完以上代码后,相当于执行了一个Person.prototype = new Object();
prototype是Person函数对象的属性,
它指向了一个对象(就是一个引用),
它指向的这个对象中的所有的属性跟方法,是每个实例所公用。
——————————————————————————————————————————————————————————————————
Person.prototype.name = "name";
Person.prototype.age = 18;
var p1 = new Person();
var p2 = new Person();
console.info(p1.name);
console.info(p2.name);
console.info(p2.age);
六.原型链(重要)
利用原型让一个引用类型继承另一个引用类型里的属性和方法。
父亲
function Father(name) {
this.fatherName = name;
}
Father.prototype.age = 18;
var ft = new Father("父亲");
console.info(ft.age);
console.info(ft.fatherName);
——————————————————————————————————————————————————————————————————
儿子
function Son(name) {
this.sonName = name;
}
Son.prototype = new Father();
//每一个对象的_proto_都来自于构造函数的prototype属性
var sn = new Son("儿子");
console.info(sn.age);
console.info(sn);
七.原型链继承(重要)
继承的好处是:复用代码
function Person(name) {
this.name = name;
this.sleep = function() {
}
}
function Student(name) {
}
//下句代码表继承
Student.prototype = new Person();
var stu = new Student();
stu.sleep();
——————————————————————————————————————————————————————————————————
1.普通对象都有_proto_
2.函数都有prototype
3._proto_是来源于prototype
4.如果自己没有该属性,则沿着_proto_往上找
———————————————————————————————————————————————————————————————————
八.组合继承(套路)
function Father(name) {
this.name = name;
}
Father.prototype.lookBook = function() {
console.info(this.name + "在看书");
}
function Son(name, age) {
//继承属性,继承不了prototype的东西
Father.apply(this, [name, age]);//或call
this.hobby = "打游戏";//这个写在哪里都无所谓
}
//继承方法method
Son.prototype = new Father();
//新的方法必须写在继承之后
Son.prototype.playPiano = function() {
}
var son = new Son("李四", 22);
son.lookBook();