工厂函数与构造函数的区别:
1.工厂函数没有使用this;
2.工厂函数首字母小写;
3.没有用NEW
4.有return;
tips:构造函数里的方法很占内存,没创建一个实例,就创建一个不同的方法对象。
eg: /*
空对象,Object是所有对象的祖先
比如:学生继承人类,人类就会继承Object
*/
var obj = new Object();
console.info(obj);
/*
js可以动态的添加属性
*/
obj.name = "flash boy";
console.info(obj);
/*
工厂函数:
他跟构造函数的区别:
1.首字母小写
2.函数中没有使用this
3.使用的时候没有用new
*/
//工厂函数
function createPerson(name) {
var o = new Object();
o.name = name;
return o; //o这个变量存了一个地址,把地址返回给p
}
//没有用new,因为它不是构造函数
var p = createPerson("洋洋");
console.info(p);
//构造函数
function Student(name) {
this.name = name;
}
构造原型方式(套路):
//创建类
//1.属性全部放在构造函数里面
//2.方法写在外面(prototype)
eg:
function Student(name) {
this.name = name;
}
Student.prototype.study = function() {
console.info(this.name + "惊呼:好好学习,天天向上");
}
var stu = new Student("洋洋");
stu.study();
var stu = new Student("张三");
原型模式:
我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定
类型的所有实例共享的属性和方法。
tips:原型的方法是用的同一个方法(构造函数用的是不同方法),所以比较省内存。
eg:
function Person() {
}
//运行完以上代码后,相当于执行了一个Person.prototype = new Object();
/*
prototype是Person函数对象的属性,
它指向了一个对象(就是一个引用),
它指向的这个对象中的所有的属性跟方法,是每个实例所公用。
*/
Person.prototype.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);
/*
我们创建的每一个函数都有一个prototype属性,这个属性是一个指针,
指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共
享的属性和方法。
*/
原型链:
1 . 普通对象都有_proto_;
2 . 函数都有prototype(原型对象);
3 . _proto_来自于函数的prototype;
4 . 如果自己没有该属性,折沿着_proto_往上找。
eg:
//父亲
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);
原型链继承:
eg:
//继承的好处是:复用代码
//让相应的对象之间的直接产生关系
function Person(name) {
this.name = name;
this.sleep = function() {
}
![](https://img2024.cnblogs.com/blog/35695/202407/35695-20240713070336838-1837943664.jpg)