1.字面量的方式
- 优点:划分命名空间,当前命名空间下的属性都是私有的
- 缺点:属于手工作业,不能实现批量生产
//描述学员信息 var stu1 = { name :张三"; age: "18"; intrioduce function(){ console.log("我叫"+this.name+",我今年"+this.age+",我来学习js了~~~"); } }; stu1.introduce();
2.工厂模式
- 优点:划分命名空间,当前命名空间下的属性都是私有的,可以实现批量生产
- 缺点:不能实例识别
-
function Student(name,age){ //创建一个空对象 var obj = {}; //给这个对象增加属性和值 obj.name = name; obj.age = age; obj.introduce = function(){ console.log("我叫"+this.name+",我今年"+this.age+",我来学习js了"); } return obj; } var stu1 = Student("王晨",18); var stu2 = Student("张三",18); console.log(stu1,stu2); stu1.introduce(); stu2.introduce(); console.log(stu1 instanceof Student);//false console.log(stu2 instanceof Student);//false </script>
3.构造函数方式
-
优点:
-
划分命名空间,当前命名空间下的属性都是私有的,可以实现批量生产,能够实现实例识别
-
缺点:不能实现公有
new一下
- 首先将当前这个函数执行
- 会自动创建一个空对象 是this (this就是那个对象,可以理解为当前这个类的实例),自动返回
//构造函数方式
//优点:划分命名空间,当前命名空间下的属性都是私有的,可以实现批量生产,能够实现实例识别
//缺点:不能实现公有
//学生类(类的本质就是函数)
function Student(name,age){
//this -> 一个空对象(实例) 自动帮我们创建
给当前这个空对象增加属性和值
this.name = name;
this.age = age;
this.introduce = function(){this.age
console.log("我叫" + this.name + ",我今年" +this.age + "岁,我来学习js了");
}
//自动返回
}
//new一下:
//1.首先将当前这个函数执行
//2.会自动创建一个空对象 是this(this就是那个对象,可以理解为当前这个类的实例),自动返回。
var stu1 = new Student("张三",100);
var stu2 = new Student("李四",12);
console.log(stu1,stu2);
stu1.introduce();
stu2.introduce();
console.log(stu1 instanceof Student);//true
console.log(stu2 instanceof Student);//true
console.log(stu1.introduce == stu2.introduce);//false 两个对象是完全独立的,属性都是私有的,introduce都是各自私有不是同一个函数
4.原型模式
优点:划分命名空间,当前命名空间下的属性都是私有的,可以实现批量生产,能够实现实例识别,实现私有是私有,公有是公有。
//原型模式 将公有的属性加到prorotype上
Student.prototype.introduce = function(){
console.log("我叫" + this.name + "我今年" + this.age + ",我来学习js啦");
}
var stu1 = new Student("张三",13);
var stu2 = new Student("李四",13);
stu1.introduce();
stu2.introduce();
console.log(stu1.introduce == stu2.introduce);//true
5.原型链
每个对象都天生自带一个属性__proto__,这个属性指向当前这个实例所属类的原型
首先原型链是一种查找机制,当前对象(实例)用到某个属性的有私有的先用私有的,没有私有的就通过__proto__属性往原型上进行查找。