【js基础】创建对象的几种常见模式(工厂模式,构造函数模式,原型模式,构造原型组合模式)
2024-08-24 07:13:25
一、工厂模式
缺点:没有解决对象识别的问题
优点:解决了创建多个相似对象的问题
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayname = function(){
console.log(this.name);
};
return o;
}
var person1 = createPerson("qqq",21,"sss");
person1.sayname();//qqq
var person2 = createPerson("aaa",22,"sas");
person2.sayname();//aaa console.log(person1 instanceof createPerson);//false
console.log(person2 instanceof createPerson);//false
console.log(person1.sayname === person2.sayname);//false
二、构造函数模式
优点:可以用来创建特定类型的对象,自定义的构造函数
缺点:每个方法都要在每个实例上重新创建一遍。2个sayName方法不是同一个Function的实例。
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayname = function(){
console.log(this.name);
};
}
var person1 = new Person("qqq",21,"sss");
person1.sayname();//qqq
var person2 = new Person("aaa",22,"sas");
person2.sayname();//aaa
console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
console.log(person1.sayname === person2.sayname);//false
三、原型模式
优点:可以让所有对象实例共享它所包含的属性和方法。就是直接在原型对象中定义对象实例信息。
缺点:省略了构造函数传递初始化参数,结果所有实例在默认情况下都将取得相同的属性!
function Person(){
} Person.prototype.name = "unio";
Person.prototype.age = "14";
Person.prototype.job = "monitor";
Person.prototype.sayname = function(){
console.log(this.name);
};
var person1 = new Person();
person1.sayname();//unio
var person2 = new Person();
person2.sayname();//unio console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
console.log(person1.sayname === person2.sayname);//true
四、组合使用构造函数和原型模式
优点:去掉构造模式和原型模式的缺点,集结二者之优点
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
} Person.prototype.sayname = function(){
console.log(this.name);
};
var person1 = new Person("qqq",21,"sss");
person1.sayname();//qqq
var person2 = new Person("aaa",22,"sas");
person2.sayname();//aaa console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
console.log(person1.sayname === person2.sayname);//true
五、动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayname != "function"){
Person.prototype.sayname = function(){
console.log(this.name);
};
}
}
var person1 = new Person("qqq",21,"sss");
person1.sayname();//qqq
var person2 = new Person("aaa",22,"sas");
person2.sayname();//aaa console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
console.log(person1.sayname === person2.sayname);//true
最新文章
- Windows下安装python2和python3双版本
- Oracle OCP 1Z0-053 Exam Topics
- EasyUI树和Ztree树冲突问题
- java 获取某个URL的文件扩展名的方法(非精确,精确的扩展名应该使用服务器返回的MIME-TYPE)
- IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍[zz]
- magic-encoding
- urllib.request ProxyHandler
- WeakHashMap理解
- CentOS修改系统默认语言与编码
- 超炫HTML5 SVG聊天框拖拽弹性摇摆动画特效
- Python 学习笔记13:Python + wsgi + django 配置。坑爹的python3和wsgi不兼容的解决
- ngnix 是什么
- 《Java大学教程》--第3章 迭代
- android中调用c++文件并转为so
- Beta冲刺(2/5)(麻瓜制造者)
- tmp目录自动清除和tmpwatch命令
- tpadmin导入数据库问题
- python psutil监控系统资源【转】
- (文章转载)MCI编程
- Chrome+XX_Net的上网渠道
热门文章
- linux中crontab的使用方法
- package.json文件中dependencies和devDependencies的区别
- 服务端如何安全获取客户端请求IP地址
- 最好用的lua编辑器--------emmylua使用汇总
- Linux 学习手记(2):Linux文件系统的基本结构
- 【精】EOS智能合约:system系统合约源码分析
- js中的DOM操作汇总
- #5 Python变量与输入输出
- 基于tcp协议下粘包现象和解决方案,socketserver
- 安装Eclipse时遇到”java was started but returned exit code = 13“如何解决?