介绍
本文是在学习JS所做的学习笔记,所有笔记内容请看:JS学习笔记
构造函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
构造函数就是一个普通的函数,创建方式和普通函数没有区别,
不同的是构造函数习惯上首字母大写
构造函数和普通函数的区别就是调用方式的不同
普通函数直接调用,而构造函数需要使用new关键字调用
构造函数的执行流程,
1.会立刻创建一个新的对象
2.将新建的对象设置为函数中的this,在构造函数中可以使用this来
引用新建的对象
3.逐行执行函数中的代码
4.将新建的对象作为返回值返回
使用同一个构造函数创建的对象,我们成为一类对象,也将一个构造函数
成为一个类。
我们将通过一个构造函数创建的对象,称为是该类实例
this的情况:
1.当以函数的形式调用时,this就是window
2、当以方法的形式调用时,谁调用方法this就是谁
3.当以构造函数的形式调用时,this就是新创建的那个对象
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=function(){
alert(this.name);
}
}
var per = new Person('swk',18,'男');
var per2= new Person('ytj',16,'女');
function Dog(){
}
var dog=new Dog();
使用instanceof 可以检查一个对象是否是一个类(构造函数)的实例
语法:
对象 instanceof 构造函数
如果是,则返回true,否则返回false
所有的对象都是Object的后代
任何对象和instanceof 检查都会返回true
</script>
</head>
<body>
创建构造函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
创建一个Person构造函数
-在Person构造函数中,为每一个对象添加一个sayName方法
目前我们的方法是在构造函数内部创建的,也就是构造函数每执行
一次就会创建一个新的sayName方法
也就是所有实例的sayName都是唯一的。
这样就导致了构造函数执行一次就会创建一个新的方法,
执行1000次就会创建1000个新的方法,而1000个方法都是一样的
*/
// 在每个函数中定义一个方法
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=function(){
alert('hello')
}
}
// 将sayName方法在全局作用域中定义
function fun(){
alert('hello')
}
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=fun;
}
}
// 创建Person的实例
var per1=new Person('swk',18,'男')
/*
将函数定义在全局作用域中,污染了全局作用域的命名空间
而且定义在全局作用域中也很不安全
*/
</script>
</head>
<body>
</body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
/*
创建一个Person构造函数
-在Person构造还能输中,为每一个对象添加一个sayName方法
目前我们的方法是在构造函数内部创建的,也就是构造函数每执行
一次就会创建一个新的sayName方法
也就是所有实例的sayName都是唯一的。
这样就导致了构造函数执行一次就会创建一个新的方法,
执行1000次就会创建1000个新的方法,而1000个方法都是一样的
*/
// 在每个函数中定义一个方法
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=function(){
alert('hello')
}
}
// 将方法写在全局作用域中那个,如下
function fun(){
alert('hello')
}
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=fun;
}
}
// 创建Person的实例
var per1=new Person('swk',18,'男')
将函数定义在全局作用域中,污染了全局作用域的命名空间
而且定义在全局作用域中也很不安全