javascript 高级编程系列 - 创建对象
1. 工厂模式 ( 通过工厂函数封装构造对象的细节)
1 function createPerson(name, age) 2 { 3 var obj = {}; 4 obj.name = name; 5 obj.age = age; 6 obj.getName = function(){ 7 return this.name; 8 }; 9 return obj; 10 } 11 12 var person = createPerson('leon', 30);
2. 构造函数模式 (生成的实例对象和构造函数建立了类型关系)
1 function Person(name, age) 2 { 3 this.name = name; 4 this.age = age; 5 this.getName = function(){ 6 return this.name; 7 }; 8 } 9 10 var person = new Person('leon', 30 );
3. 原型模式 (多个对象实例之间共享属性值和方法)
1 function Person(){ 2 3 } 4 5 Person.prototype = { 6 constructor: Person, 7 name: 'leon', 8 age: 30, 9 getName: function(){ 10 return this.name; 11 } 12 }; 13 14 var person = new Person();
4. 组合构造函数和原型模式 (构造函数模式与原型模式的结合,属性在构造函数中进行定义,方法在原型中定义)
1 function Person(name, age) 2 { 3 this.name = name; 4 this.age = age; 5 } 6 7 Person.prototype = { 8 constructor: Person, 9 getName : function(){ 10 return this.name; 11 } 12 }; 13 14 var person = new Person('leon', 30 );
5.动态原型模式 (原型模式的改进为了更好的体现封装)
1 function Person(name, age) 2 { 3 this.name = name; 4 this.age = age; 5 if( typeof this.getName != 'function'){ 6 Person.prototype.getName = function(){ 7 return this.name; 8 } 9 } 10 }
6. 寄生构造函数模式 (工厂模式与构造函数的结合)
1 function Person(name, age) 2 { 3 var obj = {}; 4 obj.name = name; 5 obj.age = age; 6 obj.getName = function(){ 7 return this.name; 8 }; 9 return obj; 10 } 11 12 var person = new Person('leon', 30);
7. 稳妥构造函数模式 (工厂模式的安全版,无公共属性,方法中无this引用)
1 function Person(name, age) 2 { 3 var obj = {}; 4 var name = name; 5 var age = age;
6 obj.getName = function(){ 7 return name; 8 }; 9 return obj; 10 } 11 12 var person = Person('leon', 30);
8. 克隆模式 (基于已有对象创建新对象)
const person = { name: 'leon', age: '38', };
// 以现有对象作为原型创建新对象 const obj = Object.create(person);
// 将指定对象的原型设置为另一个对象
const obj = Object.setPrototypeOf({}, person);
// 将现有对象自有可枚举属性复制到新对象中
const obj = Object.assign({}, person);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战