//自定义构造函数创建对象
//1.先自定义一个构造函数
function Person(name,age){
this.name = name;
this.age = age;
this.sayHi= function () {
console.log("我叫"+this.name+"我今年"+this.age)
}
}
//2.然后创建对象
var per1 = new Person("晓阳",18);
console.log(per1.name); //晓阳
console.log(per1.age); //18
per1.sayHi(); //我叫晓阳我今年18
console.log(per1 instanceof Person); //true
注意点:函数和自定义构造函数的区别?
- 普通函数在调用的时候直接 functionName(); 调用就行,自定义构造函数是为了创建对象的!需要写new
- 自定义构造函数的首字母要大写!
自定义构造函数能不能分辨出对象到底属于什么类型?
- "对象" instanceof "类型";
- 判断这个对象是不是Person类型,结果为布尔类型!
自定义构造函数实例化一个对象时,干了哪几件事
var per1 = new Person("晓阳",18);
这段代码在后台做了几件事情,也可以说是它的执行流程:
1.在内存"堆"中申请了一块空间储存对象
2.把this设置为当前对象
3.设置对象的属性和方法的值
4.把this返回
自定义构造函数的优缺点:
自定义构造函数它知道自己从哪里来,通过谁生产出来的,能判断出实例化对象的类型!
缺点:它无法数据共享.这一点可以通过原型对象解决!
自定义构造函数创建对象所带来的问题:(也就是它的缺点)
//自定义构造函数
function Dog (name){
this.name = name;
this.say = function (){
console.log("汪汪汪,我要吃狗粮")
}
}
//实例化对象
var dog1 = new Dog("金毛");
var dog2 = new Dog("泰迪");
//调用对象的方法
dog1.say();
dog2.say();
console.log(dog1.say==dog2.say)//flash
以上面代码为例:
最后一行代码返回的为flash,自定义构造函数每次实例化出来的对象,构造函数都会创建一次,所以say方法在内存中创建了两次!他们在内存中的地址不同,所以不等!
但是因为它们的逻辑和功能一样,这样就导致了代码冗余,影响性能所以这里就需要用到原型对象!
网友评论