工厂模式

  function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson('john',29,'teacher');
var person2 = createPerson('bill',15,'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('john',29,'teacher');
var person2 = new Person('bill',15,'doctor');

对象类型识别:person1.constructor == Person //true;

更可靠的对象类型识别:person1 instanceof Person //true;

          person1 instanceof Object //ture;

缺点:每个方法都要在每个实例上重新创建一遍。

person1.sayName == person2.sayName //false;

原型模式

function Person(){
}
Person.prototype = {
constructor:Person,
     //用于基础对象类型识别,但这种方法会导致constructo的[[Enumerable]]变成可枚举的。
name:'john',
age:29,
job:'doctor',
sayName:function(){
alert(this.name);
}
}
var person1 = new Person();
var person = new Person();
person1.sayName == person2.sayName //true;

缺点:省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都将取得相同的属性值。最大问题是一个实例修改隐式原型中的属性。所做的修改在所有实例都会反映出来。

组合模式(组合使用构造函数模式和原型模式)

  function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person('john',29,'teacher');
var person2 = new Person('bill',15,'doctor');

用来定义引用类型的一种默认模式。

动态原型模式

    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);
}
}
}

通过条件检测是否初始化属性。

寄生构造函数模式

    function Person(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function{
alert(this.name);
}
return o;
}
var friend = new Person('john',29,'doctor');
friend.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());

稳妥构造函数

    function Person(name,age,job){
var o = new Object();
o.sayName = function(){
alert(name);
}
return o;
}
var friend = Person('john',29,'doctor');
friend.sayName();

注:变量friend中保存的是一个稳妥对象,而除了调用sayName()方法外,没有别的方式可以访问其他数据成员 。即使有其他代码会给这个对象添加方法或数据成员,但也不可能有别的办法传入到构造函数中的原始数据。(ADsafe和Caja提供的环境就是适用)

构造函数的返回值

在传统语言中,构造函数不应该有返回值,实际执行的返回值就是此构造函数的实例化对象。

而在js中构造函数可以有返回值也可以没有。

1、没有返回值则按照其他语言一样返回实例化对象。

2、若有返回值则检查其返回值是否为引用类型。如果是非引用类型,如基本类型(string,number,boolean,null,undefined)则与无返回值相同,实际返回其实例化对象。

3、若返回值是引用类型,则实际返回值为这个引用类型。

mark-zhq[6]

javascript设计模式和构造函数返回值的更多相关文章

  1. JAVA中执行JavaScript代码并获取返回值

    JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...

  2. 获取JavaScript异步函数的返回值

    今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <s ...

  3. javascript --- 设计模式之构造函数模式

    在JavaScript里,构造函数通常是认为用来实现实例的,JavaScript没有类的概念,但是有特殊的构造函数.通过new关键字来调用定义的否早函数,你可以告诉JavaScript你要创建一个新对 ...

  4. JavaScript设计模式之构造函数模式

    一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...

  5. javascript 关于函数的返回值

    在javascript中根据调用方式的不同返回的内容也不同 1.  以函数的形式调用 当以函数的形式调用时, 返回值和函数定义时的 ruturn 有关, return的是数字就number类型, re ...

  6. javascript中的函数返回值(return)

    有些情况,我们希望获取到函数的执行结果,也就是我们需要在函数以外的地方处理执行结果,而不是在函数内部处理.这时我们就需要为函数设一个返回值,也就是return,即函数执行完毕以后返回的结果. 若在函数 ...

  7. JavaScript入门之函数返回值

    函数返回值 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

  8. javascript函数参数、返回值类型检查

    实现带参数.返回值类型声明的js函数: 类型定义:window.Str = Type.Str = Type.define('STRING', Type.isStr);var Per = Type.de ...

  9. JavaScript 函数使用return返回值

    我们可以把数据通过函数的 参数 来传入函数,也可以使用 return 语句把数据从一个函数中传出来. 举个栗子 function plusThree(num) {return num + 3;}var ...

随机推荐

  1. Redis加锁与解锁

    Redis加锁 customerM = BaseMemCached.setMLock(customerId); /** * 个人账户表加锁 **/ public static CustomerM se ...

  2. html5-框架网站

    1.html5+:http://www.html5plus.org/ 2.hbuilder:http://www.dcloud.io/ 3.mui:http://dev.dcloud.net.cn/m ...

  3. linux下nginx php配置redis

      之前一直遇到,Module compiled with module API=20090626这个坑问题!!! NOTICE: PHP message: PHP Warning: PHP Star ...

  4. HTTP/HLS/RTMP超级负载测试工具(转)

    这个负载测试工具是网游分享的工具,可以在http://blog.csdn.net/win_lin/article/details/11835011 或者https://github.com/winli ...

  5. 一个手动备份MySQL数据库的脚本

    #!/bin/bash username=root hostname=localhost password=root mysql -u$username -h$hostname -p$password ...

  6. 关于KMP算法的感想

    今天,看了KMP,首先是在网上看的,看了很久没看懂,有很多思想,很多next的推导,就相当于很多的版本,后来,去看了<<大话数据结构>>这本书,才看懂,这KMP的神奇之处,这本 ...

  7. gIt 常用 操作

    git提交代码流程git status -- 查看当前仓库状态git add  -- 添加到临时仓库git commit -m '注释'  -- 添加到临时仓库git status -- 查看当前仓库 ...

  8. Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks

    Orthogonal Least Squares Learning Algorithm for Radial Basis Function Networks S. Chen, C. F. N. Cow ...

  9. shell编程1

    shell编程1 一.shell基础正则表达式 1.正则表达式和通配符 正则表达式是用来在文件中匹配符合条件的字符串,正则式包含匹配.(grep awk sed) 通配符是用来匹配符合条件的文件名,通 ...

  10. 每天一个Linux命令(30)ln命令

    ln命令用来为文件创建链接,连接类型分为硬链接和符号链接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项.   (1)用法: 用法:  ln  [options ...