首页 > 其他分享 >js工厂模式和构造函数

js工厂模式和构造函数

时间:2022-09-18 00:00:50浏览次数:69  
标签:box run name age 工厂 obj js 构造函数

<!DOCTYPE html>
<html>
<head>
<title>工厂模式和构造函数</title>
<meta charset = "utf-8">
</head>
<body>
<script type="text/javascript">
//工厂模式跟构造函数
//在js中创建一个对象,然后在创建一个对象,将旧对象赋给新对象并修改新对象中的元素时旧对象中的元素也会随着改变,解决办法单独创建新的对象在逐一赋值。这样的话就会出现代码量大不方便。然后我们可以利用两种方法工厂模式跟构造函数,实现快速创建相同的对象名字不同。

//原有的样子
/*
var box = new Object();
//var box = { //不知道为啥这边创建对象的时候没有创建成功
// name:"XXX",age:20,sex:"nan" 出现问题:自己多大了两个分号
//};
box.name = "XXX";
box.age = 20;
box.sex = "nan";
box.run = function(){
return this.name + this.age+this.sex; //出现问题:自己忘记打了return将他们返回
};
alert(box.run());
var box2;
box2 = box;
alert(box2.run());
box2.name = "小明";
alert(box2.name);
alert(box.name); //两个都是小明

//使用最基本的方法创建类似相同的对象
var box = {
name:"xcmy",
age:20, //创建box对象并用对象方法run把上面三个属性返还出去
sex:"nan",
run:function(){
return this.name + this.age + this.sex;
}
};
var box1 = {
name:"xchs",
age:20, //创建box1对象并用对象方法run把上面三个属性返还出去
sex:"nan",
run:function(){
return this.name + this.age + this.sex;
}
};
alert(box.run());
alert(box1.run());
//这块代码多运用不方便

//工厂模式
//function creatObject(naem,age){ 出现错误:自己给name打错了
function creatObject(name,age){
//var obj = new Object{};
var obj = new Object(); //这里obj是一个对象
obj.name = name;
obj.age = age;
obj.run = function(){
return this.name + this.age;
}
//alert (obj.run());
//return obj.run(); 想试试这样是个什么效果
return obj; //将obj这个对象返回 可能对这里有些不太理解
}
//creatObject("小明", 20);
//alert(obj.run());
//alert(obj()); //明明想看看这三行能出现啥的结果啥也没出现
//alert(creatObject("小明", 20)); // 输出结果:[object Object] 这里是两个Object有些不懂
//var box.creatObject("小明",20); 出现错误:自己给调用函数的方法有些问题
var box = creatObject("小明", 20); //将返回的obj赋值给box
//alert(obj.run());
alert(box.run());
var box2 = creatObject("小红", 21);
alert(box2.run());
//对该工厂模式的理解:首先是创建一个box然后调用函数creatObject()并传送两个形参小明跟20,函数内部是创建一个obj的新对象然后给obj的对象赋上传进来的两个形参在创建一个run方法返回这两个属性,最终函数返回了对象obj,最后输出box.run()
*/
//构造函数
function Box(name, age) { //构造函数模式
this.name = name;
this.age = age;
this.run = function () {
return this.name + this.age + '运行中...';
};
}

var box1 = new Box('Lee', 100); //new Box()即可
var box2 = new Box('Jack', 200);
alert(box1.run());
alert(box1 instanceof Box);


</script>
</body>
</html>

使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题,但问题是,这里并没有new Object(),为什么可以实例化Box(),这个是哪里来的呢?
使用了构造函数的方法,和使用工厂模式的方法他们不同之处如下:
1.构造函数方法没有显示的创建对象(new Object());
2.直接将属性和方法赋值给this对象;
3.没有renturn语句。

构造函数的方法有一些规范:
1.函数名和实例化构造名相同且大写,(PS:非强制,但这么写有助于区分构造函数和普通函数);
2.通过构造函数创建对象,必须使用new运算符。

既然通过构造函数可以创建对象,那么这个对象是哪里来的,new Object()在什么地方执行了?执行的过程如下:

1.当使用了构造函数,并且new 构造函数(),那么就后台执行了new Object();
2.将构造函数的作用域给新对象,(即new Object()创建出的对象),而函数体内的this就代表new Object()出来的对象。
3. 执行构造函数内的代码;
4. 返回新对象(后台直接返回)。

标签:box,run,name,age,工厂,obj,js,构造函数
From: https://www.cnblogs.com/ifhsik/p/16704000.html

相关文章

  • JS实现保留几位小数
    根据不同的场景以及需求目前我用到的有两种一、保留2位小数(四舍五入)四舍五入的话很好解决:原生JS提供toFixed可以完美的实现四舍五入案例:letnumber=1.116number.toFi......
  • 在Go语言中,你是怎样使用Json的方法
    Encode将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error:func Marshal(v interface{}) ([]byte, error)Marshal函数将会递归遍历整个对象,依次按成......
  • json数据转成list后遍历报错
    错误代码:JSONObjectjsonObject=JSONUtil.parseObj(production);Map<String,Object>resultMap=newHashMap<>();resultMap.put("count",jsonObject.get("count"))......
  • string.js说明
    文件说明:字符类操作集合示例代码: import$stringfrom'@/common/js/string.js'$string.trim('12345') 方法列表:@name$string.trim(value)@说明:去除......
  • number.js说明
    文件说明:数字类操作集合示例代码: import$numberfrom'@/common/js/string.js'$number.isNumber('12345') 方法列表:@name $number.isNumber(value)@......
  • 简单工厂模式
    简单工厂模式工厂接口packagesimpleFactorytypedrinkinterface{show()}咖啡对象packagesimpleFactorytypecoffeestruct{}func(c*coffee)show()......
  • 【JS】数据类型
    一.常量(const)和变量(var)都是存储数据的容器 常量在声明后必须赋值,不允许为空并且不允许重新赋值变量命名可以使用:英文字母、数字(不能以数字开头)、下划线、$。不能使......
  • 6.JS操作BOM对象
    6.操作BOM对象(重点)浏览器介绍JavaScript和浏览器的关系JavaScript诞生就是为了能够让他在浏览器中运行BOM:浏览器对象模型windowwindow代表浏览器窗口Navigator......
  • C++ 关于构造函数和this调用的思考
    文中一系列思考和内容引发自以下问题:我需要在一个类的构造函数中调用另一个对象的构造函数,并使用this初始化其中的一个引用成员。主要遇到的问题:1.构造函数的初始化列表......
  • js箭头函数
    一般函数:显示结果:HelloWorld!1hello=function(){2return"HelloWorld!";3}4console.log(hello())使用箭头函数:显示结果:HelloWorld!1hello=()=>......