六、2、创建对象模式
来源:互联网 发布:手机淘宝怎么打不开了 编辑:程序博客网 时间:2024/06/15 18:18
一、工厂模式
function createPerson(name,age,jpb){
var o=new Object();o.name=name;o.job=job;o.sayName=function(){console.log(this.name);}return o;}var person1=createPerson("Nicholas",29,"Software Engineer");var person2=createPerson("Greg",27,"Doctor");
优点:可以调用函数创建多次对象
缺点:对象识别问题
二、构造函数模式
function Person(name, age, job){this.name = name;this.age = age;this.job = job;this.sayName = function(){alert(this.name);};}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 27, "Doctor");
用函数作为构造函数,然后用new操作符将函数创建为一个对象。
优点:创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型;而这正是构造函数模式胜过工厂模式的地方。
缺点:每次创建新对象时候,sayName函数都会调用Function构造函数创建一个新实例
三、原型模式
function Person(){}Person.prototype.name = "Nicholas";Person.prototype.age = 29;Person.prototype.job = "Software Engineer";Person.prototype.sayName = function(){alert(this.name);};var person1 = new Person();person1.sayName(); //"Nicholas"
prototype 就是通过调用构造函数而创建的那个对象实例的原型对象 // prototype 是 person1的原型对象
hasOwnProperty() 方法可以检测一个属性是存在于实例中,还是存在于原型中
优点:将所有属性都写到了原型上面,节省了很多不必要开销
缺点:如果其中一个方法函数只想属于其中一个实例就比较麻烦
四、组合使用构造函数模式和原型模式
function Person(name, age, job){this.name = name;this.age = age;this.job = job;this.friends = ["Shelby", "Court"];}Person.prototype = {constructor : Person,sayName : function(){alert(this.name);}}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 27, "Doctor");person1.friends.push("Van");alert(person1.friends); //"Shelby,Count,Van"alert(person2.friends); //"Shelby,Count"alert(person1.friends === person2.friends); //falsealert(person1.sayName === person2.sayName); //true
将共享属性都放到了原型中,私有属性都保存在了实例属性中
五、动态原型模式
一直不明白高程书上说的意思,不知道动态原型模式有什么意思
参考链接 https://segmentfault.com/q/1010000004546141
像前面混合构造函数模式和原型模式,属性写在构造函数中,共享方法写在原型中,感觉是分开写的,没有全部写在构造函数中。为的是不用每实例化一个对象都在构造函数原型中添加方法。
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; if (typeof this.sayName != "function") { Person.prototype.sayName = function() { alert(this.name); }; }}
如果去掉if
的话,你每new一次(即每当一个实例对象生产时),都会重新定义一个新的函数,然后挂到Person.prototype.sayName
属性上。而实际上,你只需要定义一次就够了,因为所有实例都会共享此属性的。所以如果去掉if
的话,会造成没必要的时间和空间浪费;而加上if
后,只在new第一个实例时才会定义sayName
方法,之后就不会了。六、寄生构造函数模式
function SpecialArray(){//创建数组var values = new Array();//添加值values.push.apply(values, arguments);//添加方法values.toPipedString = function(){return this.join("|");};//返回数组return values;}var colors = new SpecialArray("red", "blue", "green");alert(colors.toPipedString()); //"red|blue|green"
七、稳妥构造函数模式
function Person(name, age, job){//创建要返回的对象 var o = new Object();//可以在这里定义私有变量和函数//添加方法 o.sayName = function(){ alert(name); };//返回对象 return o; }
var friend = Person("Nicholas", 29, "Software Engineer");friend.sayName(); //"Nicholas"
让传进去的值,比如name,只能调用 friend.sayName(); //"Nicholas" ,不用this,也不用new构造函数,这就是稳妥构造函数模式的作用,安全。
阅读全文
0 0
- 六、2、创建对象模式
- JavaScript创建对象之寄生构造函数模式(六)
- 【设计模式】对象创建—创建型模式(2)
- 设计模式(2)-对象创建型模式-Factory Method模式
- 设计模式(2)-对象创建型模式-Factory Method模式
- 六、创建模式之原型(Prototype)模式
- 设计模式--六种创建型模式
- 设计模式【2】:工厂方法【创建对象】
- 对象创建型模式
- Builder模式创建对象
- 对象创建模式总结
- 创建对象的模式
- JavaScript对象创建模式
- 工厂模式创建对象
- “对象创建”模式
- JavaScript创建对象模式
- 建造模式(对象创建)
- 原型模式(对象创建)
- activiti 工作流 ace admin 整合 开发 后台框架集成 学习
- Array,List,Dictionary通过IComparer排序
- 正斜杠(/)与反斜杠(\)总结
- 设计模式之单例模式
- Linux LVM管理
- 六、2、创建对象模式
- C++广度优先搜索算法之迷宫问题
- python enumerate函数
- java.lang.IllegalStateException: commit already called
- javascript
- 家庭服务机器人仿真平台运行指南
- 万元大奖邀您参与阿里云数加 MaxCompute最佳实践征文大赛
- JZ2440 中断分析
- JAVA 方法内部类为何只能访问外部final类型变量