课程目标:
1.掌握面向对象的基本操作. 2.掌握构造函数的优化策略. 3.创建对象的方式.
1.创建对象的三种方式:
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
//创建对象的第一种方式
/*let obj=new Object();
obj.name="cyg";
obj.age=20;
obj.say=function()
{
console.log("666");
}
console.log(obj.name);
console.log(o*/
// 创建对象的第二种方式
/*let obj={};
obj.name="cyg";
obj.age=20;
obj.say=function()
{
console.log("777");
}
console.log(obj.name);
console.log(obj.age);
obj.say();*/
// 创建对象的第三种方式
let obj={
name:"cyg",
age:20,
say:function()
{
console.log("888");
}
};
console.log(obj.name);
console.log(obj.age);
obj.say();
</script>
</body>
</html>
形式:
代码语言:javascript复制对象名.方法名=function()
{
//输出内容
}
let 对象名=new Object();
对象名.属性;
对象名.方法名();
//第二种方式:
let 对象名={};
对象名.属性名=属性;
对象名.方法名=function()
{
输出内容
}
//第三种方式:
let 对象名={
属性名:属性值,
方法名:function()
{
输出内容
}
};
总结:
记住,对象有属性&&方法才能叫做对象.
效果:
函数和方法区别
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
function demo()
{
console.log(this);
}
window.demo();
let obj={
name:"cyg",
test:function()
{
console.log(this);
}
};
obj.test();
</script>
</body>
</html>
总结:
函数与方法区别是: 函数是window调用的. 方法是对象调用的
效果:
工厂函数
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
function createPerson(myName, myAge)
{
let obj=new Object();
obj.name=myName;
obj.age=myAge;
obj.say=function()
{
console.log("hello world");
}
return obj;
}
let obj1=createPerson("cyg",20);
let obj2=createPerson("liwen",20);
console.log(obj1);
console.log(obj2);
</script>
</body>
</html>
总结:
工厂函数与构造函数的区别是: 1.构造函数是工厂函数的简化. 2.构造函数是通过new来调用.工厂函数是通过普通函数来调用的.
构造函数二重奏:
第一重:
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
function Person(myName, myAge)
{
//let obj=new Object();
//let this=obj;
//以上两句系统自动添加
this.name=myName;
this.age=myAge;
this.say=function()
{
console.log("hello world");
}
//以下系统自动添加
//return this;
}
let obj1=new Person("cyg",20);
let obj2=new Person("liwen",20);
console.log(obj1);
console.log(obj2);
</script>
</body>
</html>
总结:
1.构造函数执行完才能被称为创建对象完了.
效果:
第二重:
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
//功能:用案例讲述this的指向问题.
function Person(myName, myAge)
{
this.name=myName;
this.age=myAge;
this.say=function()
{
console.log(this.name,this.age);
}
}
let obj1=new Person("cyg",20);
obj1.say();
let obj2 = new Person("zs", 44);
obj2.say();
console.log(obj1.say===obj2.say);
// 通过三个等号来判断两个函数名称, 表示判断两个函数是否都存储在同一块内存中
//2:
function demo()
{
console.log("demo");
}
console.log(demo===demo);
</script>
</body>
</html>
总结:
构造函数与普通函数的区别:
1.在同一个构造函数创建出来的对象是不一样的(地址不一样),比如这里的obj1与obj2. 2.调用普通函数是一样的(内存地址.)
效果:
构造函数优化三重奏:
第一奏:
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
function mySay()
{
console.log("hello world");
}
function Person(myName, myAge)
{
this.name = myName;
this.age = myAge;
this.say = mySay;
}
let obj1 = new Person("lnj", 34);
let obj2 = new Person("zs", 44);
console.log(obj1.say === obj2.say);
</script>
</body>
</html>
总结: 优化为了什么? 为了使内存地址一样,不占用内存把. 1.调用了同一个普通函数.
效果:
第二奏:
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
/*function mySay()
{
console.log("666");
}*/
//简化为:
let fns={
mySay:function()
{
console.log("666");
}
};
function Person(myName, myAge)
{
this.name=myName;
this.age=myAge;
this.say=fns.mySay;
}
let obj1=new Person("cyg",20);
let obj2=new Person("liwen",20);
console.log(obj1.say===obj2.say);
</script>
</body>
</html>
总结:
1.调用对象是一样的,比如我爱你。他也爱你.是不是爱的是一个人啊。 2.调用构造函数是不一样的,为什么,因为他是类中的。类是一个整体不是个体啊.
效果:
代码语言:javascript复制<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
let fns = {
test: function () {
console.log("test");
}
}
console.log(fns.test === fns.test);
</script>
</body>
</html>
总结:
1.因为调用的是对象,不是构造函数啊,构造函数在类中啊
效果: