/*
* JavaScript不区分类和实例的概念,是通过原型(prototype)来实现面向对象编程
* 类:类是对象的类型模板,比如定义Student类来表示学生,但是它不代表任何具体的学生
* 实例:实例是根据类创建的对象,比如根据Student类,可以创建出“小米”,“小明”等多个
* 实例,每一个实例代表一个学生,这些实例全部属于Student类
*/
//创建对象
var obj = new Object();
obj.name ="小明";//静态是属性
obj.age = "在荒岛";
obj.run = function(){//动态是方法
return this.name+this.age+"跑毒。。。";//this在对象里面,指向对象的实例
}
console.log(typeof obj,obj);
console.log(obj.run());
//工厂函数:为了解决类型对象声明的问题,也是为了解决实例化对象产生大量代码重复的问题
function createObj(name,age){
var obj1 = new Object();
obj1.name = name;
obj1.age = age;
obj1.run = function(){
return this.name+this.age+"在跑毒。。。";
}
return obj1;
}
var create_obj = createObj("高组长","唱,跳");
var create_obj1 = createObj("海哥","篮球,rap");
console.log(create_obj,create_obj1);
console.log(create_obj instanceof createObj);
/*
* 工厂模式的问题:
* 1.创建不同的对象,其中的属性和方法都会重复创建,消耗内存
* 2.会产生函数识别问题
* 注意事项:
* 1.用函数将所有内容都打包起来,按照需求传入形参
* 2.函数内部必须返回对象
*/
/*
* 构造函数
* 构造函数的方法的规范:
* 1.函数名和实例化构造名相同且大写(非强制性,有助于区分构造函数个普通函数)
* 2.通过构造函数创建对象,必须使用关键字new
* 构造函数和普通函数的区别:
* 使用关键字new是构造函数,没有是普通函数
*/
function Obj(name.age){
this.name = name;
//this代表当前作用域对象的引用,如果在全局范围,指向的是window对象,如果在构造函数体内,指向的是构造函数所声明的对象
this.age = age;
this.run = function(){
return this.name+this.age+"在上课";
}
}
var obj2 = new Obj("小黑",30);
var obj3 = new Obj("小红",32);
console.log(obj2.run());
console.log(obj3.run());
console.log(obj3 instanceof Obj);//true 识别函数是否为对象的实例
console.log(obj2===obj3);//false 同一个构造函数的实例之间无法共享属性和方法
/*
* 构造函数解决了工厂函数遗留的函数识别的问题,没有解决内存消耗的问题,同时还带了新的this指向
* 的问题
*
* 构造函数创建的执行过程
* 1.当使用了构造函数,并且使用new 构造函数(),就会在后台执行new Object()
* 2.将构造函数的作用域只给新的对象(也就是用过new Object()创建出来的实例),函数体内this就代表当前被创建出来的实例
* 3.执行构造函数体内的代码
* 4.返回新对象
*/
对象封装
猜你喜欢
转载自blog.csdn.net/weixin_45936690/article/details/104607432
今日推荐
周排行